diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 337559b404..ccf362d516 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -9,3 +9,7 @@ Fixes # (issue) ## Video/Screenshots + +## PR Test Details + +**Note**: The PR will be ready for live testing at https://rocketchat.github.io/EmbeddedChat/pulls/pr- after approval. Contributors are requested to replace `` with the actual PR number. diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml index d92c4001a5..6a67b3e3cc 100644 --- a/.github/workflows/build-and-lint.yml +++ b/.github/workflows/build-and-lint.yml @@ -12,21 +12,21 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 16.19.0 + node-version: 24 - name: Set up Yarn - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: 16.19.0 - cache: 'yarn' + node-version: 24 + cache: "yarn" - name: Cache dependencies - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ~/.yarn key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} @@ -34,7 +34,7 @@ jobs: ${{ runner.os }}-yarn- - name: Install dependencies - run: yarn + run: yarn install - name: Format check run: yarn format:check diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml new file mode 100644 index 0000000000..6354f57146 --- /dev/null +++ b/.github/workflows/build-pr.yml @@ -0,0 +1,65 @@ +name: Build PR-Preview + +on: + pull_request_review: + types: [submitted] + +concurrency: + group: ${{github.workflow}}-${{github.ref}} + cancel-in-progress: true + +env: + LAYOUT_EDITOR_BASE_URL: "/EmbeddedChat/pulls/pr-${{github.event.pull_request.number}}/layout_editor" + DOCS_BASE_URL: "/EmbeddedChat/pulls/pr-${{github.event.pull_request.number}}/docs" + STORYBOOK_RC_HOST: "https://demo.qa.rocket.chat" + +jobs: + build: + if: github.event.review.state == 'approved' && (github.event.review.author_association == 'COLLABORATOR' || github.event.review.author_association == 'OWNER') + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: "24" + + - name: Install Dependencies + run: yarn install + + - name: Build packages + run: yarn build && yarn build:storybook + + - name: Setup Node.js for Docs + uses: actions/setup-node@v4 + with: + node-version: "24" + + - name: "Install dependencies for docs" + run: yarn install + working-directory: packages/docs/ + + - name: Build Docs + run: yarn build + working-directory: packages/docs/ + + - name: Prepare Build Folder + run: | + mkdir -p build/pulls/pr-${{github.event.pull_request.number}}/ + mkdir -p build/pulls/pr-${{github.event.pull_request.number}}/ui-elements + mkdir -p build/pulls/pr-${{github.event.pull_request.number}}/layout_editor + mkdir -p build/pulls/pr-${{github.event.pull_request.number}}/docs + + mv -v packages/react/storybook-static/* build/pulls/pr-${{github.event.pull_request.number}}/ + mv -v packages/ui-elements/storybook-static/* build/pulls/pr-${{github.event.pull_request.number}}/ui-elements/ + mv -v packages/layout_editor/dist/* build/pulls/pr-${{github.event.pull_request.number}}/layout_editor/ + mv -v packages/docs/build/* build/pulls/pr-${{github.event.pull_request.number}}/docs/ + + - name: Upload Artifacts + uses: actions/upload-artifact@v4 + with: + name: github-pages + path: build/ diff --git a/.github/workflows/deploy-pr.yml b/.github/workflows/deploy-pr.yml new file mode 100644 index 0000000000..4f687507d3 --- /dev/null +++ b/.github/workflows/deploy-pr.yml @@ -0,0 +1,36 @@ +name: Deploy PR-Preview + +on: + workflow_run: + workflows: ["Build PR-Preview"] + types: + - completed + +permissions: + contents: write + pages: write + +jobs: + deploy: + if: github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + + steps: + - uses: actions/download-artifact@v4 + with: + name: github-pages + path: build/ + github-token: ${{github.token}} + repository: ${{github.repository}} + run-id: ${{github.event.workflow_run.id}} + + - name: Deploy to GitHub Pages + uses: crazy-max/ghaction-github-pages@v2 + with: + target_branch: gh-deploy + build_dir: build/ + commit_message: "Deploy to Github Pages" + jekyll: false + keep_history: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 3099455b0c..57e3f82069 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,4 +1,4 @@ -name: Build and Publish Storybook to GitHub Pages +name: Build and Publish on: push: @@ -27,27 +27,18 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: "16.19.0" + node-version: "24" - name: Install Dependencies - run: yarn - - - name: Build Storybook - run: yarn build:storybook - working-directory: packages/react - - - name: Build UI-Elements - run: yarn build:storybook - working-directory: packages/ui-elements + run: yarn install - - name: Build Layout Editor - run: npm run build - working-directory: packages/layout_editor + - name: Build packages + run: yarn build && yarn build:storybook - name: Setup Node.js for Docs uses: actions/setup-node@v4 with: - node-version: "18.x" + node-version: "24" - name: "Install dependencies for docs" run: yarn install diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 088f92dcdb..133120bfc5 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,60 +1,61 @@ name: Playwright Tests + on: push: branches: [main, develop] pull_request: branches: [main, develop] + jobs: test: timeout-minutes: 60 - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Setup Node.js environment - uses: actions/setup-node@v3 - with: - node-version: 16.19.0 - - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: ~/.yarn - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install dependencies - run: yarn install - - - name: Build the project - run: | - yarn build - - - name: Get installed Playwright version - id: playwright-version - run: echo "::set-output name=version::$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" - - - uses: actions/cache@v3 - id: playwright-cache - with: - path: '~/.cache/ms-playwright' - key: '${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}' - restore-keys: | - ${{ runner.os }}-playwright- - - - name: Install Playwright's dependencies - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: npx playwright install --with-deps - - - name: Run Playwright tests - run: cd packages/e2e-react && npx playwright test - - - name: Upload Playwright report - uses: actions/upload-artifact@v3 - if: always() - with: - name: playwright-report - path: packages/e2e-react/playwright-report/ - retention-days: 30 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 24 + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: ~/.yarn + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install dependencies + run: yarn install + + - name: Build the project + run: yarn build + + - name: Get installed Playwright version + id: playwright-version + run: echo "version=$(yarn why --json @playwright/test | grep -h 'workspace:.' | jq --raw-output '.children[].locator' | sed -e 's/@playwright\/test@.*://')" >> $GITHUB_OUTPUT + + - uses: actions/cache@v4 + id: playwright-cache + with: + path: "~/.cache/ms-playwright" + key: "${{ runner.os }}-playwright-${{ steps.playwright-version.outputs.version }}" + restore-keys: | + ${{ runner.os }}-playwright- + + - name: Install Playwright's dependencies + if: steps.playwright-cache.outputs.cache-hit != 'true' + run: npx playwright install --with-deps + + - name: Run Playwright tests + run: cd packages/e2e-react && npx playwright test + + - name: Upload Playwright report + uses: actions/upload-artifact@v4 + if: always() + with: + name: playwright-report + path: packages/e2e-react/playwright-report/ + retention-days: 30 diff --git a/.github/workflows/pr-cleanup.yml b/.github/workflows/pr-cleanup.yml new file mode 100644 index 0000000000..6c2af76390 --- /dev/null +++ b/.github/workflows/pr-cleanup.yml @@ -0,0 +1,34 @@ +name: Pull Request Cleanup +on: + pull_request_target: + types: [closed] + +jobs: + cleanup: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + ref: gh-deploy + + - name: Check if Deployment Exists + id: check_deployment + run: | + if [ -d "pulls/pr-${{ github.event.pull_request.number }}" ]; then + echo "deployment_exists=true" >> $GITHUB_ENV + else + echo "deployment_exists=false" >> $GITHUB_ENV + fi + + - name: Remove Deployment + if: env.deployment_exists == 'true' + run: | + git config --global user.email "github-actions[bot]@users.noreply.github.com" + git config --global user.name "github-actions[bot]" + git fetch origin gh-deploy + git checkout gh-deploy + git rm -r pulls/pr-${{github.event.pull_request.number}} + git commit -m "Remove deployment for PR #${{github.event.pull_request.number}}" + git push origin gh-deploy diff --git a/.nvmrc b/.nvmrc index d60d573ec6..5804aaa4f5 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16.19.0 \ No newline at end of file +v24.0.0 \ No newline at end of file diff --git a/.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch b/.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch new file mode 100644 index 0000000000..b6f291d1a5 --- /dev/null +++ b/.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch @@ -0,0 +1,17 @@ +diff --git a/lib/index.mjs b/lib/index.mjs +index 35c18fc129e349205d3db64bfb7b9c589c726d35..7fe10a375d6e6d4d46bb1c4a776fdc75f062c3d3 100644 +--- a/lib/index.mjs ++++ b/lib/index.mjs +@@ -1,4 +1,4 @@ +-import * as module from './module.mjs'; ++import * as _module from './module.mjs'; + export { assert, assertEquals, assertGuard, assertGuardEquals, createAssert, createAssertEquals, createAssertGuard, createAssertGuardEquals, createEquals, createIs, createRandom, createValidate, createValidateEquals, equals, is, random, validate, validateEquals } from './module.mjs'; + import * as functional from './functional.mjs'; + export { functional }; +@@ -22,5 +22,5 @@ export { TypeGuardError } from './TypeGuardError.mjs'; + + + +-export { module as default }; ++export { _module as default }; + //# sourceMappingURL=index.mjs.map diff --git a/README.md b/README.md index 455b2fa897..2c68bde9d8 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Ensure that the "Enable CORS" option is turned on in your Rocket.Chat server. Yo #### Prerequisites -- **Node.js**: Version 16.19.0 is required. Use [Node Version Manager (NVM)](https://github.com/nvm-sh/nvm) for easy switching between Node.js versions. +- **Node.js**: Version 22 (LTS) is required. Use [Node Version Manager (NVM)](https://github.com/nvm-sh/nvm) for easy switching between Node.js versions. To install and use the correct Node.js version, execute the following commands with the specific version number: diff --git a/package.json b/package.json index 3868bafb9c..fba99b7004 100644 --- a/package.json +++ b/package.json @@ -22,9 +22,16 @@ "esbuild": "^0.17.19", "husky": "^9.0.11", "lerna": "^6.6.2", + "semver": "^7.6.0", "typescript": "^5.1.3" }, "dependencies": { - "dompurify": "^3.1.6" + "dompurify": "^3.1.6", + "validator": "^13.15.15" + }, + "resolutions": { + "react": "^19.0.0", + "react-dom": "^19.0.0", + "typia": "patch:typia@npm%3A9.7.2#./.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch" } } diff --git a/packages/api/package.json b/packages/api/package.json index a05ca8e630..5eeffcbc17 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@embeddedchat/auth": "workspace:^", - "@rocket.chat/sdk": "^1.0.0-alpha.42" + "@rocket.chat/ddp-client": "1.0.9-rc.2", + "@rocket.chat/emitter": "^0.31.25" } } diff --git a/packages/api/playground/index.html b/packages/api/playground/index.html index 6091350192..d850068e98 100644 --- a/packages/api/playground/index.html +++ b/packages/api/playground/index.html @@ -24,6 +24,14 @@ .playground-output #output{ white-space: pre-wrap; } + #togglePassword { + display: inline-flex; + align-items: center; + justify-content: center; + cursor: pointer; + vertical-align: middle; + width: 50px; + } @@ -43,6 +51,9 @@
+
diff --git a/packages/api/playground/playground.js b/packages/api/playground/playground.js index e280d9a4c9..d572018423 100644 --- a/packages/api/playground/playground.js +++ b/packages/api/playground/playground.js @@ -1,4 +1,5 @@ import EmbeddedChatApi from '../src/EmbeddedChatApi'; + let messages = []; async function saveToken(token) { localStorage.setItem("ec_token", token); @@ -96,6 +97,7 @@ const callApi = async (e) => { const result = await api[fn].apply(api, params); printResult(result); } + window.addEventListener('DOMContentLoaded', () => { console.log('Ready') document.getElementById("loginWithPassword").addEventListener("click", loginWithPassword) @@ -113,8 +115,25 @@ window.addEventListener('DOMContentLoaded', () => { document.getElementById("logoutBtn").addEventListener("click", () => api.auth.logout()) document.getElementById("call-api").addEventListener("click", callApi) + const passwordField = document.getElementById('password') + const togglePassword = document.getElementById('togglePassword') + togglePassword.addEventListener('click',() => toggle(passwordField, togglePassword)) }) +let isPasswordVisible = false + +const toggle = (passwordField, togglePassword) => { + isPasswordVisible = !isPasswordVisible + + if(isPasswordVisible){ + passwordField.type = "text" + togglePassword.innerText = "Hide"; + } else { + passwordField.type = "password"; + togglePassword.innerText = "Show"; + } +} + function escapeHTML(str) { return str.replace( /[&<>'"]/g, diff --git a/packages/api/rollup.config.js b/packages/api/rollup.config.js index 5351b95f5f..6ce2f32df8 100644 --- a/packages/api/rollup.config.js +++ b/packages/api/rollup.config.js @@ -1,7 +1,13 @@ import dts from 'rollup-plugin-dts' import esbuild from 'rollup-plugin-esbuild' -import packageJson from './package.json' assert { type: 'json' }; import path from 'path'; +import { createRequire } from 'module'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const require = createRequire(import.meta.url); +const packageJson = require(path.resolve(__dirname, './package.json')); const name = packageJson.main.replace(/\.js$/, ''); diff --git a/packages/api/src/EmbeddedChatApi.ts b/packages/api/src/EmbeddedChatApi.ts index 574370a5b1..b775016170 100644 --- a/packages/api/src/EmbeddedChatApi.ts +++ b/packages/api/src/EmbeddedChatApi.ts @@ -1,4 +1,4 @@ -import { Rocketchat } from "@rocket.chat/sdk"; +import { DDPSDK } from "@rocket.chat/ddp-client"; import cloneArray from "./cloneArray"; import { ROCKETCHAT_APP_ID } from "./utils/constants"; import { @@ -12,7 +12,7 @@ let typingHandlerLock = 0; export default class EmbeddedChatApi { host: string; rid: string; - rcClient: Rocketchat; + sdk: DDPSDK; onMessageCallbacks: ((message: any) => void)[]; onMessageDeleteCallbacks: ((messageId: string) => void)[]; onTypingStatusCallbacks: ((users: string[]) => void)[]; @@ -20,6 +20,9 @@ export default class EmbeddedChatApi { onUiInteractionCallbacks: ((data: any) => void)[]; typingUsers: string[]; auth: RocketChatAuth; + private _connectPromise: Promise | null = null; + private _activeSubscriptions: { stop: () => void }[] = []; + private _authListener: ((user: any) => void) | null = null; constructor( host: string, @@ -28,11 +31,9 @@ export default class EmbeddedChatApi { ) { this.host = host; this.rid = rid; - this.rcClient = new Rocketchat({ - protocol: "ddp", - host: this.host, - useSsl: !/http:\/\//.test(host), - reopen: 20000, + this.sdk = DDPSDK.create(this.host, { + retryCount: 10, + retryTime: 2000, }); this.onMessageCallbacks = []; this.onMessageDeleteCallbacks = []; @@ -46,10 +47,57 @@ export default class EmbeddedChatApi { getToken, saveToken, }); + this._registerAuthListener(); + } + + private _applyCredentials(user: any) { + const userId = user?.userId || user?.data?.userId; + const authToken = user?.authToken || user?.data?.authToken; + if (userId && authToken) { + this.sdk.rest.setCredentials({ + "X-User-Id": userId, + "X-Auth-Token": authToken, + }); + } + } + + private _registerAuthListener() { + this._authListener = (user: any) => { + if (user) { + this._applyCredentials(user); + } + }; + this.auth.onAuthChange(this._authListener); + } + + private async _restRequest( + endpoint: string, + method: "GET" | "POST" | "PUT" | "DELETE" = "GET", + body?: any + ) { + const options: RequestInit = {}; + if (body !== undefined) { + options.headers = { "Content-Type": "application/json" }; + options.body = typeof body === "string" ? body : JSON.stringify(body); + } + const response = await this.sdk.rest.send(endpoint, method, options); + return response.json(); + } + + private async _restUpload(endpoint: string, formData: FormData) { + const response = await this.sdk.rest.send(endpoint, "POST", { + body: formData, + }); + return response.json(); } setAuth(auth: RocketChatAuth) { + // Remove listener from the old auth instance before swapping. + if (this._authListener) { + this.auth.removeAuthListener(this._authListener); + } this.auth = auth; + this._registerAuthListener(); } getAuth() { @@ -112,8 +160,9 @@ export default class EmbeddedChatApi { if (response.error === "totp-required") { return response; } - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } @@ -121,12 +170,12 @@ export default class EmbeddedChatApi { let credentials; if (!code) { credentials = credentials = { - user: userOrEmail, + user: userOrEmail.trim(), password, }; } else { credentials = { - user: userOrEmail, + user: userOrEmail.trim(), password, code, }; @@ -142,7 +191,7 @@ export default class EmbeddedChatApi { const authErrorRes = await error.response.json(); return { error: authErrorRes?.error }; } - console.error(error); + console.error(error instanceof Error ? error.message : error); } } @@ -169,15 +218,19 @@ export default class EmbeddedChatApi { break; } } catch (error) { - console.error("Auto-login failed:", error); + console.error( + "Auto-login failed:", + error instanceof Error ? error.message : error + ); } } async logout() { try { await this.auth.logout(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } @@ -186,91 +239,115 @@ export default class EmbeddedChatApi { * TODO: Add logic to call thread message event listeners. To be done after thread implementation */ async connect() { + // Guard against concurrent connect() calls (e.g. React StrictMode double-invoke) + if (this._connectPromise) { + return this._connectPromise; + } + this._connectPromise = this._doConnect().finally(() => { + this._connectPromise = null; + }); + return this._connectPromise; + } + + private _normalizeMessage(data: any) { + if (!data) return null; + const message = JSON.parse(JSON.stringify(data)); + if (message.ts?.$date) { + message.ts = message.ts.$date; + } + if (!message.ts) { + message.ts = new Date().toISOString(); + } + return message; + } + + private async _doConnect() { try { - await this.close(); // before connection, all previous subscriptions should be cancelled - await this.rcClient.connect({}); - const token = (await this.auth.getCurrentUser())?.authToken; - await this.rcClient.resume({ token }); - await this.rcClient.subscribeRoom(this.rid); - await this.rcClient.onMessage((data: any) => { - if (!data) { - return; - } - const message = JSON.parse(JSON.stringify(data)); - if (message.ts?.$date) { - console.log(message.ts?.$date); - message.ts = message.ts.$date; - } - if (!message.ts) { - message.ts = new Date().toISOString(); - } - this.onMessageCallbacks.map((callback) => callback(message)); - }); - await this.rcClient.subscribe( - "stream-notify-room", - `${this.rid}/user-activity` - ); - await this.rcClient.onStreamData( - "stream-notify-room", - (ddpMessage: any) => { - const [roomId, event] = ddpMessage.fields.eventName.split("/"); + this.close(); // before connection, all previous subscriptions should be cancelled + await this.sdk.connection.connect(); - if (roomId !== this.rid) { - return; - } + const currentUser = (await this.auth.getCurrentUser()) as any; + const token = currentUser?.authToken || currentUser?.data?.authToken; + if (token) { + await this.sdk.account.loginWithToken(token); + } - if (event === "user-activity") { - const typingUser = ddpMessage.fields.args[0]; - const isTyping = ddpMessage.fields.args[1]?.includes("user-typing"); - this.handleTypingEvent({ typingUser, isTyping }); + // Subscribe to room messages + const roomMsgSub = this.sdk.stream( + "room-messages", + [this.rid, false], + (data: any) => { + const message = this._normalizeMessage(data); + if (message) { + this.onMessageCallbacks.forEach((callback) => callback(message)); } - - if (event === "typing") { - const typingUser = ddpMessage.fields.args[0]; - const isTyping = ddpMessage.fields.args[1]; + } + ); + this._activeSubscriptions.push(roomMsgSub); + + // Subscribe to room notifications (typing, delete) + const notifyRoomSub = this.sdk.stream( + "notify-room", + [`${this.rid}/user-activity`, false], + (...args: any[]) => { + const typingUser = args[0]; + const activities = args[1]; + if (Array.isArray(activities)) { + const isTyping = activities.includes("user-typing"); this.handleTypingEvent({ typingUser, isTyping }); + } else { + // Legacy "typing" event: args[1] is a boolean + this.handleTypingEvent({ typingUser, isTyping: !!activities }); } - if (event === "deleteMessage") { - const messageId = ddpMessage.fields.args[0]?._id; - this.onMessageDeleteCallbacks.map((callback) => + } + ); + this._activeSubscriptions.push(notifyRoomSub); + + // Subscribe to room delete events + const deleteRoomSub = this.sdk.stream( + "notify-room", + [`${this.rid}/deleteMessage`, false], + (...args: any[]) => { + const messageId = args[0]?._id; + if (messageId) { + this.onMessageDeleteCallbacks.forEach((callback) => callback(messageId) ); } } ); - await this.rcClient.subscribeNotifyUser(); - await this.rcClient.onStreamData( - "stream-notify-user", - (ddpMessage: any) => { - const [, event] = ddpMessage.fields.eventName.split("/"); - const args: any[] = ddpMessage.fields.args - ? Array.isArray(ddpMessage.fields.args) - ? ddpMessage.fields.args - : [ddpMessage.fields.args] - : []; - if (event === "message") { - const data = args[0]; + this._activeSubscriptions.push(deleteRoomSub); + + // Subscribe to user notifications (action triggers, UI interactions) + const userId = this.sdk.account.uid; + if (userId) { + const notifyUserMsgSub = this.sdk.stream( + "notify-user", + [`${userId}/message`, false], + (data: any) => { if (!data || data?.rid !== this.rid) { return; } - const message = JSON.parse(JSON.stringify(data)); - if (message.ts?.$date) { - message.ts = message.ts.$date; - } - if (!message.ts) { - message.ts = new Date().toISOString(); + const message = this._normalizeMessage(data); + if (message) { + message.renderType = "blocks"; + this.onMessageCallbacks.forEach((callback) => callback(message)); } - message.renderType = "blocks"; - this.onMessageCallbacks.map((callback) => callback(message)); - } else if (event === "uiInteraction") { - this.onUiInteractionCallbacks.forEach((callback) => - callback(args[0]) - ); } - } - ); + ); + this._activeSubscriptions.push(notifyUserMsgSub); + + const notifyUserUiSub = this.sdk.stream( + "notify-user", + [`${userId}/uiInteraction`, false], + (data: any) => { + this.onUiInteractionCallbacks.forEach((callback) => callback(data)); + } + ); + this._activeSubscriptions.push(notifyUserUiSub); + } } catch (err) { - await this.close(); + this.close(); } } @@ -390,231 +467,189 @@ export default class EmbeddedChatApi { return null; } return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async updateUserNameThroughSuggestion(userid: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/users.getUsernameSuggestion`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + const suggestedUsername = await this._restRequest( + "/v1/users.getUsernameSuggestion" ); - - const suggestedUsername = await response.json(); - if (suggestedUsername.success) { - const response2 = await fetch(`${this.host}/api/v1/users.update`, { - body: `{"userId": "${userid}", "data": { "username": "${suggestedUsername.result}" }}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/users.update", "POST", { + userId: userid, + data: { username: suggestedUsername.result }, }); - - return await response2.json(); } - } catch (error) { - console.error(error); + } catch (error: any) { + console.error(error instanceof Error ? error.message : error); + return error; } } async updateUserUsername(userid: string, username: string) { const newUserName = username.replace(/\s/g, ".").toLowerCase(); - const usernameRegExp = /[0-9a-zA-Z-_.]+/; if (usernameRegExp.test(newUserName)) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/users.update`, { - body: `{"userId": "${userid}", "data": { "username": "${newUserName}" }}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/users.update", "POST", { + userId: userid, + data: { username: newUserName }, }); - - const result = await response.json(); - - if ( - !result.success && - result.errorType === "error-could-not-save-identity" - ) { + } catch (err: any) { + if (err?.errorType === "error-could-not-save-identity") { return await this.updateUserNameThroughSuggestion(userid); } - return result; - } catch (err) { - console.error(err); + console.error(err instanceof Error ? err.message : err); } } else { return this.updateUserNameThroughSuggestion(userid); } } - async channelInfo() { + async channelInfo(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/rooms.info?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } - ); - return await response.json(); - } catch (err) { - console.error(err); + return await this._restRequest(`/v1/rooms.info?roomId=${this.rid}`); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; + } + } + + async getRoomInfo(): Promise { + try { + return await this.channelInfo(); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async permissionInfo() { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/permissions.listAll`, { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - }); - return await response.json(); - } catch (err) { - console.error(err); + return await this._restRequest("/v1/permissions.listAll"); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async close() { - await this.rcClient.unsubscribeAll(); - await this.rcClient.disconnect(); + this._activeSubscriptions.forEach((sub) => sub.stop()); + this._activeSubscriptions = []; + this.sdk.connection.close(); } - /** - * @param {boolean} anonymousMode - * @param {Object} options This object should include query or fields. - * query - json object which accepts MongoDB query operators. - * fields - json object with properties that have either 1 or 0 to include them or exclude them - * @returns messages - */ async getMessages( anonymousMode = false, options: { - query?: object | undefined; - field?: object | undefined; - } = { - query: undefined, - field: undefined, - }, + oldest?: string; + latest?: string; + count?: number; + } = {}, isChannelPrivate = false ) { const roomType = isChannelPrivate ? "groups" : "channels"; const endp = anonymousMode ? "anonymousread" : "messages"; - const query = options?.query - ? `&query=${JSON.stringify(options.query)}` - : ""; - const field = options?.field - ? `&field=${JSON.stringify(options.field)}` - : ""; + const oldest = options?.oldest ? `&oldest=${options.oldest}` : ""; + const latest = options?.latest ? `&latest=${options.latest}` : ""; + const count = options?.count != null ? `&count=${options.count}` : ""; try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const messages = await fetch( - `${this.host}/api/v1/${roomType}.${endp}?roomId=${this.rid}${query}${field}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/${roomType}.${endp}?roomId=${this.rid}${oldest}${latest}${count}` ); - return await messages.json(); - } catch (err) { - console.log(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getThreadMessages(tmid: string, isChannelPrivate = false) { - return this.getMessages( - false, - { - query: { - tmid, - }, - }, - isChannelPrivate - ); + async getOlderMessages( + anonymousMode = false, + options: { + oldest?: string; + latest?: string; + count?: number; + offset?: number; + } = {}, + isChannelPrivate = false + ) { + const roomType = isChannelPrivate ? "groups" : "channels"; + const endp = anonymousMode ? "anonymousread" : "messages"; + const oldest = options?.oldest ? `&oldest=${options.oldest}` : ""; + const latest = options?.latest ? `&latest=${options.latest}` : ""; + const count = options?.count != null ? `&count=${options.count}` : ""; + const offset = options?.offset ? `&offset=${options.offset}` : "&offset=0"; + try { + return await this._restRequest( + `/v1/${roomType}.${endp}?roomId=${this.rid}${oldest}${latest}${count}${offset}` + ); + } catch (err: any) { + console.error(err instanceof Error ? err.message : String(err)); + return err; + } + } + + async getThreadMessages( + tmid: string, + isChannelPrivate = false + ): Promise { + try { + return await this._restRequest(`/v1/chat.getThreadMessages?tmid=${tmid}`); + } catch (err: any) { + console.error(err instanceof Error ? err.message : String(err)); + return err; + } } async getChannelRoles(isChannelPrivate = false) { const roomType = isChannelPrivate ? "groups" : "channels"; try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const roles = await fetch( - `${this.host}/api/v1/${roomType}.roles?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/${roomType}.roles?roomId=${this.rid}` ); - return await roles.json(); - } catch (err) { - console.log(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : String(err)); + return err; } } async getUsersInRole(role: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const roles = await fetch( - `${this.host}/api/v1/roles.getUsersInRole?role=${role}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } - ); - return await roles.json(); + return await this._restRequest(`/v1/roles.getUsersInRole?role=${role}`); + } catch (err: any) { + console.error(err instanceof Error ? err.message : String(err)); + return err; + } + } + + async getUserRoles() { + try { + const response = await this.getUsersInRole("admin"); + if (response && response.success) { + return { result: response.users }; + } + return { result: [] }; } catch (err) { - console.log(err); + console.error(err instanceof Error ? err.message : err); + return { result: [] }; } } async sendTypingStatus(username: string, typing: boolean) { try { - this.rcClient.methodCall( + await this.sdk.call( "stream-notify-room", `${this.rid}/user-activity`, username, typing ? ["user-typing"] : [] ); } catch (err) { - console.error(err); + // DDP typing indicator fails when connection is temporarily down — expected, safe to ignore } } @@ -622,299 +657,190 @@ export default class EmbeddedChatApi { * @param {*} message should be a string or an rc message object * Refer https://developer.rocket.chat/reference/api/schema-definition/message#message-object */ - async sendMessage(message: any, threadId: string) { + async sendMessage(message: any, threadId: string): Promise { const messageObj = typeof message === "string" - ? { - rid: this.rid, - msg: message, - } - : { - ...message, - rid: this.rid, - }; + ? { rid: this.rid, msg: message } + : { ...message, rid: this.rid }; if (threadId) { messageObj.tmid = threadId; } try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.sendMessage`, { - body: JSON.stringify({ message: messageObj }), - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.sendMessage", "POST", { + message: messageObj, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async deleteMessage(msgId: string) { + async deleteMessage(msgId: string): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.delete`, { - body: `{"roomId": "${this.rid}", "msgId": "${msgId}","asUser" : true }`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.delete", "POST", { + roomId: this.rid, + msgId, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async updateMessage(msgId: string, text: string) { + async updateMessage(msgId: string, text: string): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.update`, { - body: `{"roomId": "${this.rid}", "msgId": "${msgId}","text" : "${text}" }`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.update", "POST", { + roomId: this.rid, + msgId, + text, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getAllFiles(isChannelPrivate = false) { + async getAllFiles(isChannelPrivate = false, typeGroup: string) { const roomType = isChannelPrivate ? "groups" : "channels"; try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/${roomType}.files?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } - ); - return await response.json(); - } catch (err) { - console.error(err); + const endpoint = + typeGroup === "" + ? `/v1/${roomType}.files?roomId=${this.rid}` + : `/v1/${roomType}.files?roomId=${this.rid}&typeGroup=${typeGroup}`; + return await this._restRequest(endpoint); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getAllImages() { + async getAllImages(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/channels.images?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } - ); - return await response.json(); - } catch (err) { - console.error(err); + return await this._restRequest(`/v1/rooms.images?roomId=${this.rid}`); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async starMessage(mid: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.starMessage`, { - body: `{"messageId": "${mid}"}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.starMessage", "POST", { + messageId: mid, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async unstarMessage(mid: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.unStarMessage`, { - body: `{"messageId": "${mid}"}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.unStarMessage", "POST", { + messageId: mid, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getStarredMessages() { + async getStarredMessages(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/chat.getStarredMessages?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/chat.getStarredMessages?roomId=${this.rid}` ); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getPinnedMessages() { + async getPinnedMessages(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/chat.getPinnedMessages?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/chat.getPinnedMessages?roomId=${this.rid}` ); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getMentionedMessages() { + async getMentionedMessages(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/chat.getMentionedMessages?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/chat.getMentionedMessages?roomId=${this.rid}` ); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async pinMessage(mid: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.pinMessage`, { - body: `{"messageId": "${mid}"}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.pinMessage", "POST", { + messageId: mid, }); - return await response.json(); } catch (err) { - return { - error: err, - }; + return { error: err }; } } async unpinMessage(mid: string) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.unPinMessage`, { - body: `{"messageId": "${mid}"}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.unPinMessage", "POST", { + messageId: mid, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async reactToMessage(emoji: string, messageId: string, shouldReact: string) { + async reactToMessage( + emoji: string, + messageId: string, + shouldReact: boolean | string + ): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.react`, { - body: `{"messageId": "${messageId}", "emoji": "${emoji}", "shouldReact": ${shouldReact}}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.react", "POST", { + messageId, + emoji, + shouldReact: + typeof shouldReact === "string" + ? shouldReact === "true" + : shouldReact, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async reportMessage(messageId: string, description: string) { + async reportMessage(messageId: string, description: string): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/chat.reportMessage`, { - body: `{"messageId": "${messageId}", "description": "${description}"}`, - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", + return await this._restRequest("/v1/chat.reportMessage", "POST", { + messageId, + description, }); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async findOrCreateInvite() { + async findOrCreateInvite(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/findOrCreateInvite`, { - method: "POST", - body: JSON.stringify({ rid: this.rid, days: 1, maxUses: 10 }), - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, + return await this._restRequest("/v1/findOrCreateInvite", "POST", { + rid: this.rid, + days: 1, + maxUses: 10, }); - return await response.json(); - } catch (err) { - console.log(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : String(err)); + return err; } } @@ -925,131 +851,88 @@ export default class EmbeddedChatApi { threadId = undefined ) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const form = new FormData(); - if (threadId) { - form.append("tmid", threadId); + const currentUser = await this.auth.getCurrentUser(); + if (!currentUser?.userId || !currentUser?.authToken) { + console.error("sendAttachment: User not authenticated"); + return; } + + const form = new FormData(); form.append("file", file, fileName); - form.append( - "description", - fileDescription.length !== 0 ? fileDescription : "" + + const uploadResult = await this._restUpload( + `/v1/rooms.media/${this.rid}`, + form + ); + + if (!uploadResult.success || !uploadResult.file?._id) { + console.error("sendAttachment: Upload failed", uploadResult); + return uploadResult; + } + + return await this._restRequest( + `/v1/rooms.mediaConfirm/${this.rid}/${uploadResult.file._id}`, + "POST", + threadId + ? { msg: "", description: fileDescription || "", tmid: threadId } + : { msg: "", description: fileDescription || "" } ); - const response = fetch(`${this.host}/api/v1/rooms.upload/${this.rid}`, { - method: "POST", - body: form, - headers: { - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - }).then((r) => r.json()); - return response; } catch (err) { - console.log(err); + console.error("sendAttachment error:", err); } } - async me() { + async me(): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/me`, { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - }); - return await response.json(); - } catch (err) { - console.error(err); + return await this._restRequest("/v1/me"); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async getChannelMembers(isChannelPrivate = false) { const roomType = isChannelPrivate ? "groups" : "channels"; try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/${roomType}.members?roomId=${this.rid}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/${roomType}.members?roomId=${this.rid}` ); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } - async getSearchMessages(text: string) { + async getSearchMessages(text: string): Promise { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/chat.search?roomId=${this.rid}&searchText=${text}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } + return await this._restRequest( + `/v1/chat.search?roomId=${this.rid}&searchText=${encodeURIComponent( + text + )}` ); - return await response.json(); - } catch (err) { - console.error(err); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async getMessageLimit() { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/settings/Message_MaxAllowedSize`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - } - ); - return await response.json(); - } catch (err) { - console.error(err); + return await this._restRequest("/v1/settings/Message_MaxAllowedSize"); + } catch (err: any) { + console.error(err instanceof Error ? err.message : err); + return err; } } async handleUiKitInteraction(appId: string, userInteraction: any) { try { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const triggerId = Math.random().toString(32).slice(2, 16); - - const response = await fetch( - `${this.host}/api/apps/ui.interaction/${appId}`, - { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", - body: JSON.stringify({ - triggerId, - ...userInteraction, - }), - } + const interaction = await this._restRequest( + `/apps/ui.interaction/${appId}`, + "POST", + { triggerId, ...userInteraction } ); - - const interaction = await response.json(); this.onActionTriggeredCallbacks.forEach((cb) => cb(interaction)); return interaction; } catch (e) { @@ -1058,70 +941,38 @@ export default class EmbeddedChatApi { } async getCommandsList() { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/commands.list`, { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "GET", - }); - const data = await response.json(); - return data; + return await this._restRequest("/v1/commands.list"); } - async execCommand({ command, params }: { command: string; params: string }) { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch(`${this.host}/api/v1/commands.run`, { - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - method: "POST", - body: JSON.stringify({ - command, - params, - roomId: this.rid, - triggerId: Math.random().toString(32).slice(2, 20), - }), + async execCommand({ + command, + params, + tmid, + }: { + command: string; + params: string; + tmid?: string; + }) { + return await this._restRequest("/v1/commands.run", "POST", { + command, + params, + tmid, + roomId: this.rid, + triggerId: Math.random().toString(32).slice(2, 20), }); - const data = await response.json(); - return data; } async getUserStatus(reqUserId: string) { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/users.getStatus?userId=${reqUserId}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - } - ); - const data = response.json(); - return data; + return await this._restRequest(`/v1/users.getStatus?userId=${reqUserId}`); } - async userInfo(reqUserId: string) { - const { userId, authToken } = (await this.auth.getCurrentUser()) || {}; - const response = await fetch( - `${this.host}/api/v1/users.info?userId=${reqUserId}`, - { - method: "GET", - headers: { - "Content-Type": "application/json", - "X-Auth-Token": authToken, - "X-User-Id": userId, - }, - } + async userInfo(reqUserId: string): Promise { + return await this._restRequest(`/v1/users.info?userId=${reqUserId}`); + } + + async userData(username: string): Promise { + return await this._restRequest( + `/v1/users.info?username=${encodeURIComponent(username)}` ); - const data = response.json(); - return data; } } diff --git a/packages/api/src/ddp-client.d.ts b/packages/api/src/ddp-client.d.ts new file mode 100644 index 0000000000..e9f4c39859 --- /dev/null +++ b/packages/api/src/ddp-client.d.ts @@ -0,0 +1,15 @@ +// Type augmentation for @rocket.chat/ddp-client +// The published .d.ts for DDPSDK is missing the stream() method declaration, +// even though it exists in the JS implementation and the SDK interface it implements. +// This augmentation adds it back so TypeScript can see it. +import type { ClientStream } from "@rocket.chat/ddp-client/dist/types/ClientStream"; + +declare module "@rocket.chat/ddp-client" { + interface DDPSDK { + stream( + name: string, + data: unknown, + cb: (...data: any[]) => void + ): ReturnType & { stop: () => void }; + } +} diff --git a/packages/auth/rollup.config.js b/packages/auth/rollup.config.js index ab1343496a..6ce2f32df8 100644 --- a/packages/auth/rollup.config.js +++ b/packages/auth/rollup.config.js @@ -1,7 +1,13 @@ import dts from 'rollup-plugin-dts' import esbuild from 'rollup-plugin-esbuild' import path from 'path'; -import packageJson from './package.json' assert { type: 'json' }; +import { createRequire } from 'module'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const require = createRequire(import.meta.url); +const packageJson = require(path.resolve(__dirname, './package.json')); const name = packageJson.main.replace(/\.js$/, ''); diff --git a/packages/auth/src/Api.ts b/packages/auth/src/Api.ts index 78d6c82c7a..f8967ff486 100644 --- a/packages/auth/src/Api.ts +++ b/packages/auth/src/Api.ts @@ -44,7 +44,8 @@ export class Api { if (!response.ok) { throw new ApiError(response, "Failed Api Request for " + endpoint); } - const jsonData = await response.json(); + const text = await response.text(); + const jsonData = text.length ? JSON.parse(text) : {}; return { data: jsonData }; } diff --git a/packages/auth/src/RocketChatAuth.ts b/packages/auth/src/RocketChatAuth.ts index 0f2c55f196..9b6b10c5ed 100644 --- a/packages/auth/src/RocketChatAuth.ts +++ b/packages/auth/src/RocketChatAuth.ts @@ -36,7 +36,9 @@ class RocketChatAuth { async onAuthChange(callback: (user: object | null) => void) { this.authListeners.push(callback); const user = await this.getCurrentUser(); - callback(user); + if (this.authListeners.includes(callback)) { + callback(user); + } } async removeAuthListener(callback: (user: object | null) => void) { @@ -107,6 +109,7 @@ class RocketChatAuth { api: this.api, }); this.setUser(response.data); + this.notifyAuthListeners(); return this.currentUser; } @@ -190,10 +193,10 @@ class RocketChatAuth { try { const token = await this.getToken(); if (token) { - const user = await this.loginWithResumeToken(token); // will notifyAuthListeners on successful login + const user = await this.loginWithResumeToken(token); if (user) { this.lastFetched = new Date(); - await this.getCurrentUser(); // refresh the token if needed + await this.getCurrentUser(); } } } catch (e) { diff --git a/packages/auth/src/loginWithRocketChatOAuth.ts b/packages/auth/src/loginWithRocketChatOAuth.ts index 955e70c7a4..66a553a9f1 100644 --- a/packages/auth/src/loginWithRocketChatOAuth.ts +++ b/packages/auth/src/loginWithRocketChatOAuth.ts @@ -45,6 +45,9 @@ width=800,height=600,left=-1000,top=-1000,rel=opener`; return new Promise((resolve) => { if (popup) { const onMessage = async (e: MessageEvent) => { + if (e.origin !== new URL(config.api.baseUrl).origin) { + return; + } if (e.data.type === "rc-oauth-callback") { const { accessToken, expiresIn, serviceName } = e.data.credentials; const response = await config.api.post("/api/v1/login", { diff --git a/packages/docs/README.md b/packages/docs/README.md index 812eeb9d01..a063ab8a28 100644 --- a/packages/docs/README.md +++ b/packages/docs/README.md @@ -1,17 +1,29 @@ # EmbeddedChat Documentation -This is the official documentation website of EmbeddedChat +This is the official documentation website of EmbeddedChat. + +> **Node.js Version Requirement** +> +> The `docs/` folder requires **Node.js v22 or higher** to run correctly. +> If you’re using a lower version (e.g., v18), you may encounter errors. +> +> Use [NVM](https://github.com/nvm-sh/nvm) to install and switch to the correct version: +> +> ```bash +> nvm install 22 +> nvm use 22 +> ``` ### Installation ``` -$ yarn install + yarn install ``` ### Local Development ``` -$ yarn dev + yarn dev ``` This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. @@ -19,7 +31,7 @@ This command starts a local development server and opens up a browser window. Mo ### Build ``` -$ yarn build + yarn build ``` This command generates static content into the `build` directory and can be served using any static contents hosting service. diff --git a/packages/docs/blog/EmbeddedChat-2024.md b/packages/docs/blog/EmbeddedChat-2024.md index 6827d5940b..2d65e99fb0 100644 --- a/packages/docs/blog/EmbeddedChat-2024.md +++ b/packages/docs/blog/EmbeddedChat-2024.md @@ -89,7 +89,7 @@ A demonstration video is available here: -For further details on theming, you can visit the [documentation](https://github.com/RocketChat/EmbeddedChat/blob/develop/packages/docs/theming.md) or check out the [technical guide](https://github.com/RocketChat/EmbeddedChat/blob/develop/packages/docs/theming_technical.md) for insights on how theming is implemented in the repository. +For further details on theming, you can visit the [documentation](https://rocketchat.github.io/EmbeddedChat/docs/docs/Usage/theming) or check out the [technical guide](https://rocketchat.github.io/EmbeddedChat/docs/docs/Development/theming_technical) for insights on how theming is implemented in the repository. ### Enhanced Authentication with HTTP-Only Cookies @@ -99,7 +99,7 @@ A video demonstration is available here: -For more information on authentication, refer to the [authentication guide](https://github.com/RocketChat/EmbeddedChat/blob/develop/packages/docs/authentication.md). +For more information on authentication, refer to the [authentication guide](https://rocketchat.github.io/EmbeddedChat/docs/docs/Usage/authentication). ### UI-Kit Improvement @@ -134,7 +134,7 @@ The following videos demonstrate its usage: -To set up the EmbeddedChat RC App, follow this guide: [EmbeddedChat RC App Setup](https://github.com/RocketChat/EmbeddedChat/blob/develop/packages/docs/ec_rc_setup.md). +To set up the EmbeddedChat RC App, follow this guide: [EmbeddedChat RC App Setup](https://rocketchat.github.io/EmbeddedChat/docs/docs/Usage/ec_rc_setup). ### Layout Editor @@ -144,7 +144,7 @@ A video demonstration showcases the features: -To learn more about the layout editor, visit the guide: [Layout Editor Guide](https://github.com/RocketChat/EmbeddedChat/blob/develop/packages/docs/layout_editor.md). +To learn more about the layout editor, visit the guide: [Layout Editor Guide](https://rocketchat.github.io/EmbeddedChat/docs/docs/Usage/layout_editor). ## 🚀 Contributions diff --git a/packages/docs/docs/Usage/authentication.md b/packages/docs/docs/Usage/authentication.md index 95c3c3e7b9..3a496980cc 100644 --- a/packages/docs/docs/Usage/authentication.md +++ b/packages/docs/docs/Usage/authentication.md @@ -74,8 +74,6 @@ This method leverages the OAuth configuration established in Rocket.Chat, ensuri For instructions on installing the EmbeddedChat RC app on your Rocket.Chat server, refer to the [EmbeddedChat RC App installation guide](../Usage/ec_rc_setup.md). -Certainly! Here are the instructions to enable OAuth login in the EmbeddedChat RC app, without using sub-bullets: - #### Steps to Enable OAuth Login in EmbeddedChat RC App 1. Copy Callback URL: diff --git a/packages/docs/docusaurus.config.js b/packages/docs/docusaurus.config.js index f9073bfa8e..0ffbd70998 100644 --- a/packages/docs/docusaurus.config.js +++ b/packages/docs/docusaurus.config.js @@ -17,7 +17,7 @@ const config = { url: "https://rocketchat.github.io/", // Set the // pathname under which your site is served // For GitHub pages deployment, it is often '//' - baseUrl: "/EmbeddedChat/docs/", + baseUrl: process.env.DOCS_BASE_URL || "/EmbeddedChat/docs/", // GitHub pages deployment config. // If you aren't using GitHub pages, you don't need these. @@ -123,6 +123,11 @@ const config = { }, ], }, + colorMode: { + defaultMode: 'light', + disableSwitch: false, + respectPrefersColorScheme: true, + }, prism: { theme: prismThemes.github, darkTheme: prismThemes.dracula, diff --git a/packages/docs/package.json b/packages/docs/package.json index f14a34ce8a..52db122f1f 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -19,8 +19,8 @@ "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { "@docusaurus/module-type-aliases": "3.5.1", @@ -38,7 +38,10 @@ "last 5 safari version" ] }, + "resolutions": { + "webpack": "5.96.1" + }, "engines": { - "node": ">=18.0" + "node": ">=24.0.0" } } diff --git a/packages/docs/src/css/custom.css b/packages/docs/src/css/custom.css index 8fa55b551b..8697856532 100644 --- a/packages/docs/src/css/custom.css +++ b/packages/docs/src/css/custom.css @@ -5,7 +5,7 @@ */ /* You can override the default Infima variables here. */ -:root { +[data-theme='light']:root { --ifm-color-primary: #1f3e05; --ifm-color-primary-dark: #29784c; --ifm-color-primary-darker: #277148; diff --git a/packages/docs/yarn.lock b/packages/docs/yarn.lock index e12862dfd2..a5c34bca17 100644 --- a/packages/docs/yarn.lock +++ b/packages/docs/yarn.lock @@ -5,126 +5,217 @@ __metadata: version: 6 cacheKey: 8 -"@algolia/autocomplete-core@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-core@npm:1.9.3" +"@algolia/abtesting@npm:1.18.1": + version: 1.18.1 + resolution: "@algolia/abtesting@npm:1.18.1" dependencies: - "@algolia/autocomplete-plugin-algolia-insights": 1.9.3 - "@algolia/autocomplete-shared": 1.9.3 - checksum: ce78048568660184a4fa3c6548f344a7f5ce0ba45d4cfc233f9756b6d4f360afd5ae3a18efefcd27a626d3a0d6cf22d9cba3e21b217afae62b8e9d11bc4960da + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: a74a4b921d33dc58568cbdffed079ae75d3c005b72eb43376a0c326a4e74599703bc1545a7db8b6bb4e5104e60db3b5504fe18d52ce1fe52612077971367dc0e languageName: node linkType: hard -"@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.9.3" +"@algolia/autocomplete-core@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-core@npm:1.17.9" + dependencies: + "@algolia/autocomplete-plugin-algolia-insights": 1.17.9 + "@algolia/autocomplete-shared": 1.17.9 + checksum: dde242b1a2d8485e6c7bc94d00e25d707aa66dcd276ee1dde13213f1620bf6a1d289a61c657e40c707ca726a8aa009ab5e8229f92ae5cf22266de490b0634d20 + languageName: node + linkType: hard + +"@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.17.9" dependencies: - "@algolia/autocomplete-shared": 1.9.3 + "@algolia/autocomplete-shared": 1.17.9 peerDependencies: search-insights: ">= 1 < 3" - checksum: 030695bf692021c27f52a3d4931efed23032796e326d4ae7957ae91b51c36a10dc2d885fb043909e853f961c994b8e9ff087f50bb918cfa075370562251a199f + checksum: 32761d44a407d7c5ecfae98bb78b45a1ca85c59f44167ea36057315fb357c49684e9126bb7a67a513a27bda60a9661cecd6215f2daa903288860201b0b18c745 languageName: node linkType: hard -"@algolia/autocomplete-preset-algolia@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-preset-algolia@npm:1.9.3" +"@algolia/autocomplete-preset-algolia@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-preset-algolia@npm:1.17.9" dependencies: - "@algolia/autocomplete-shared": 1.9.3 + "@algolia/autocomplete-shared": 1.17.9 peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 1ab3273d3054b348eed286ad1a54b21807846326485507b872477b827dc688006d4f14233cebd0bf49b2932ec8e29eca6d76e48a3c9e9e963b25153b987549c0 + checksum: 0dac2aae02121d37466b4ce1ca533420b25cd70e218a9e645e6194bd84a6012a0e94c22125437adb89599ecf14e4488882f91da382c6c9a8d9447e929b317522 languageName: node linkType: hard -"@algolia/autocomplete-shared@npm:1.9.3": - version: 1.9.3 - resolution: "@algolia/autocomplete-shared@npm:1.9.3" +"@algolia/autocomplete-shared@npm:1.17.9": + version: 1.17.9 + resolution: "@algolia/autocomplete-shared@npm:1.17.9" peerDependencies: "@algolia/client-search": ">= 4.9.1 < 6" algoliasearch: ">= 4.9.1 < 6" - checksum: 06014c8b08d30c452de079f48c0235d8fa09904bf511da8dc1b7e491819940fd4ff36b9bf65340242b2e157a26799a3b9aea01feee9c5bf67be3c48d7dff43d7 + checksum: f16223f5995db0deb014a066e3587ec2da76e62b861aa21411be92cb255b7023507803283803d8c960b396a2c6b690951337c32fef34f68c59ecfb3822dee577 + languageName: node + linkType: hard + +"@algolia/cache-browser-local-storage@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/cache-browser-local-storage@npm:4.27.0" + dependencies: + "@algolia/cache-common": 4.27.0 + checksum: f495cc5130caea73effcee371164fd6322deda3c2b78c26f688542e6c44e706925c148cf48675173b2e3ab7eafa8889bc5cccae07c300f2fd5e990d10cbc0b68 + languageName: node + linkType: hard + +"@algolia/cache-common@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/cache-common@npm:4.27.0" + checksum: 0e3629d291ccd4b40919826450bc538a16ec0f1aa77a8f104639dee1de9263a1fa6ff982d1afabae7a14ac91807820d716ed4b8019c0d54dce2b7e9fa361887b + languageName: node + linkType: hard + +"@algolia/cache-in-memory@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/cache-in-memory@npm:4.27.0" + dependencies: + "@algolia/cache-common": 4.27.0 + checksum: 055f6220a7ab4db328102d473bb0e4a40afcc1ad8ec215c401361d063865fde2cfab24c947b66080c2214f6168dbc7a289897513556e6bb74856e32c6a22a438 + languageName: node + linkType: hard + +"@algolia/client-abtesting@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-abtesting@npm:5.52.1" + dependencies: + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: a65f92bcf4e4fb8a851b5f49bfa387d3a44c6d3753af539f83041d0cb40b5dead99474ac5ad6c07cb9301de72aacf294ec153157c92ddc9ead7e172a32432cb5 + languageName: node + linkType: hard + +"@algolia/client-account@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/client-account@npm:4.27.0" + dependencies: + "@algolia/client-common": 4.27.0 + "@algolia/client-search": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: c9afa59d111eb9fa17dc4ba235d17190845dbfb640a39e4e54e3d3146fb64072367d0b8d9d40694c143d99883c9c0ca226eea1b42b967c14e230d64d4ec72c34 + languageName: node + linkType: hard + +"@algolia/client-analytics@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/client-analytics@npm:4.27.0" + dependencies: + "@algolia/client-common": 4.27.0 + "@algolia/client-search": 4.27.0 + "@algolia/requester-common": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: 76515fb1ef89480e50060dd723ff16818b9cb94193243f675dd10d1138ef567930a32c595189fe830c7a96aafc85dd3351c607e817b9e8d57f93fabf7e19c962 languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-browser-local-storage@npm:4.24.0" +"@algolia/client-analytics@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-analytics@npm:5.52.1" dependencies: - "@algolia/cache-common": 4.24.0 - checksum: f7f9bdb1fa37e788a5cb8c835e526caff2fa097f68736accd4c82ade5e5cb7f5bbd361cf8fc8c2a4628d979d81bd90597bdaed77ca72de8423593067b3d15040 + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: d0572e7abc82642442a468918fb699fca4ca4c365093862d0b45b03a8c72511d2387585a353bd5a9618641f6893c3d37c2f0e35b5a6805b263f27bb314d46dd6 languageName: node linkType: hard -"@algolia/cache-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-common@npm:4.24.0" - checksum: bc1d0f8731713f7e6f10cd397b7d8f7464f14a2f4e1decc73a48e99ecbc0fe41bd4df1cc3eb0a4ecf286095e3eb3935b2ea40179de98e11676f8e7d78c622df8 +"@algolia/client-common@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/client-common@npm:4.27.0" + dependencies: + "@algolia/requester-common": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: c8da03a715799646c96e97bf9970192431e39ff8ae3d68e66fd704a8d047d5e417da720ad6110ab8038a178e4ed784d544c5d19651a35fcb97d02dd5d4203c64 + languageName: node + linkType: hard + +"@algolia/client-common@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-common@npm:5.52.1" + checksum: f92954c9b7a9cae5129eaadfe07cff84244dea2b578e30736603826dcfb0a1c0cd2ef2c461202307e11096ba6c1be63a05d0951dfb408aa743e947ddd4b7f1ef languageName: node linkType: hard -"@algolia/cache-in-memory@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/cache-in-memory@npm:4.24.0" +"@algolia/client-insights@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-insights@npm:5.52.1" dependencies: - "@algolia/cache-common": 4.24.0 - checksum: 0476f65f4b622b1b38f050a03b9bf02cf6cc77fc69ec785d16e244770eb2c5eea581b089a346d24bdbc3561be78d383f2a8b81179b801b2af72d9795bc48fee2 + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: a764e6884f7e38b0b1f18d83cb296749aa7d9c497defd2d165d99a9ca2ba6683551220a599551161873abcdae1f9dea52e23c0da54422a73da3fc1bef328fb01 languageName: node linkType: hard -"@algolia/client-account@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-account@npm:4.24.0" +"@algolia/client-personalization@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/client-personalization@npm:4.27.0" dependencies: - "@algolia/client-common": 4.24.0 - "@algolia/client-search": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 059cf39f3e48b2e77a26435267284d2d15a7a3c4e904feb2b2ad2dd207a3ca2e2b3597847ec9f3b1141749b25fb2e6091e9933f53cb86ab278b5b93836c85aad + "@algolia/client-common": 4.27.0 + "@algolia/requester-common": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: 479c6dc8d275180aab93f92a33d685f306c7e8c7179c3c8ec4c0c5644b91d028aeb8c1c7ccaed75d95580d9786ca617d6eab82efc3928fa8ea3b416d376719d9 languageName: node linkType: hard -"@algolia/client-analytics@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-analytics@npm:4.24.0" +"@algolia/client-personalization@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-personalization@npm:5.52.1" dependencies: - "@algolia/client-common": 4.24.0 - "@algolia/client-search": 4.24.0 - "@algolia/requester-common": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 17540315bc7ed2ed962fe343129ffe6dcd535cd37d4893765b5b3306a5a2b0a32260d116e77c13541bbc932480b14e24cc640eeecae338bebe7b57bc2cf9cde5 + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: 9188f721f32f7c8be597f837b47804a6c0fb5c7e2ea073c80eb6f6659791fedb47f45df11eff0731f3358e2993c5eaf8c6dd4da44847ff6d19a2cdaef144d23d languageName: node linkType: hard -"@algolia/client-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-common@npm:4.24.0" +"@algolia/client-query-suggestions@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-query-suggestions@npm:5.52.1" dependencies: - "@algolia/requester-common": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 19c6615f9e1b0bbda7dd8ecd285c5bdf48d7067223b06e385a6c69a20a6d6500086619fa0f9e63403cf33220d5d7a288360df55452fdf00f5feca8ca9852758a + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: 302e9f11a8d445044e3231b6dbf6ca18c6d5c0a404f808d2cf5a0d04090d35f1fb5bda59a55eb10d6c6bbf112bce379c66419b4bc9aec9cde77663ab22b3a109 languageName: node linkType: hard -"@algolia/client-personalization@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-personalization@npm:4.24.0" +"@algolia/client-search@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/client-search@npm:4.27.0" dependencies: - "@algolia/client-common": 4.24.0 - "@algolia/requester-common": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 9c569c6d846f7c9cf3056b83f2c67d9e796b5afa7e7aa55b1e125a2cf5a7342c96d94e7e2005931145698a1d1fc9a56d692f56a5b09fc4a4291bcc83b73addba + "@algolia/client-common": 4.27.0 + "@algolia/requester-common": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: 6bffce55cc46ee339c9d0d5493b8c11049c0c0a68d5a1687ceec149cf42e22abaec29c12348814d0663099312e9dc90316246d57595c2b12777046f37e971d0b languageName: node linkType: hard -"@algolia/client-search@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/client-search@npm:4.24.0" +"@algolia/client-search@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/client-search@npm:5.52.1" dependencies: - "@algolia/client-common": 4.24.0 - "@algolia/requester-common": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 2d19823994e92490885115188d75994fbcc7a407fbe14f52034b191607a51081ed476e367a65c889666f6b337b00d700203204d55666f182809f01fbd29fd1fb + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: 4378e7e00884b118b602a5aba20a200e836f3847b3e9f55977c734827160116f622d7c21dc3c93189aeb2c648e802efcd34f4f5c8d065f5380dca843c2e2c1b0 languageName: node linkType: hard @@ -135,74 +226,137 @@ __metadata: languageName: node linkType: hard -"@algolia/logger-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/logger-common@npm:4.24.0" - checksum: 668fb5a2cbb6aaea7648ae522b5d088241589a9da9f8abb53e2daa89ca2d0bc04307291f57c65de7a332e092cc054cc98cc21b12af81620099632ca85c4ef074 +"@algolia/ingestion@npm:1.52.1": + version: 1.52.1 + resolution: "@algolia/ingestion@npm:1.52.1" + dependencies: + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: eb198762f95480f694b32b548ab22367b8096baa45ae8418c92a63b9eb53b9fdf992733c6d2f38237521b116ab7595c4048a3da5b5a7f1e7104260775566e768 + languageName: node + linkType: hard + +"@algolia/logger-common@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/logger-common@npm:4.27.0" + checksum: 1d3c7b445bda72a2696123fcc9bc4e2702908e258ee0596b738e92c169d2524c26b29c7a5eb1c979f1823f5fbb9537113fe3aa56e57c6240c2f51f1ed80f2ec2 + languageName: node + linkType: hard + +"@algolia/logger-console@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/logger-console@npm:4.27.0" + dependencies: + "@algolia/logger-common": 4.27.0 + checksum: ec187e61c07dd528ae059684dcb99bab1e6b530a8c717b5e5e124da1d998b85a8cd376d55540ea490c2aee2b3bdf24b5d4b41e3f72c4974a15b1bcb309de6189 + languageName: node + linkType: hard + +"@algolia/monitoring@npm:1.52.1": + version: 1.52.1 + resolution: "@algolia/monitoring@npm:1.52.1" + dependencies: + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: e51cf342fb80f95c38d1a4556d0ffef3f3cf007edd965077cd1071acebcd5d76ef11218e6c602f3d623ea93857f1b91fb11406df4edb022c01cb5281698df0b1 + languageName: node + linkType: hard + +"@algolia/recommend@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/recommend@npm:4.27.0" + dependencies: + "@algolia/cache-browser-local-storage": 4.27.0 + "@algolia/cache-common": 4.27.0 + "@algolia/cache-in-memory": 4.27.0 + "@algolia/client-common": 4.27.0 + "@algolia/client-search": 4.27.0 + "@algolia/logger-common": 4.27.0 + "@algolia/logger-console": 4.27.0 + "@algolia/requester-browser-xhr": 4.27.0 + "@algolia/requester-common": 4.27.0 + "@algolia/requester-node-http": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: f9e385ec1ac864acb9430710cae4cdb74e4c9627a83bbc1a9f929b33034998157b939df273dc6924f2665da6e3d986a1ab6d605b34b680a88d59cfca056c4369 + languageName: node + linkType: hard + +"@algolia/recommend@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/recommend@npm:5.52.1" + dependencies: + "@algolia/client-common": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: 6f87737895f9e47ddcd2dafcda3086ac0a85cdcd50af6f159319d404cfda65895a86d98ef9e02ef427a25ee4d828932c9ccf756ad1d42531993aa9b428625bcf languageName: node linkType: hard -"@algolia/logger-console@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/logger-console@npm:4.24.0" +"@algolia/requester-browser-xhr@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/requester-browser-xhr@npm:4.27.0" dependencies: - "@algolia/logger-common": 4.24.0 - checksum: 846d94ecac2e914a2aa7d1ace301cca7371b2bc757c737405eca8d29fc1a26e788387862851c90f611c90f43755367ce676802a21fa37a3bf8531b1a16f5183b + "@algolia/requester-common": 4.27.0 + checksum: 8ca2bc006b68cf703cd659f99db04abcf3ff3e89c0633ecab7eb0d26acad030121fcd3f7e2990efb7fa16f389d0109ee4d4aefc4f95d4d57dacd8ff16289eee9 languageName: node linkType: hard -"@algolia/recommend@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/recommend@npm:4.24.0" +"@algolia/requester-browser-xhr@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/requester-browser-xhr@npm:5.52.1" dependencies: - "@algolia/cache-browser-local-storage": 4.24.0 - "@algolia/cache-common": 4.24.0 - "@algolia/cache-in-memory": 4.24.0 - "@algolia/client-common": 4.24.0 - "@algolia/client-search": 4.24.0 - "@algolia/logger-common": 4.24.0 - "@algolia/logger-console": 4.24.0 - "@algolia/requester-browser-xhr": 4.24.0 - "@algolia/requester-common": 4.24.0 - "@algolia/requester-node-http": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 426468452186cbcf0653c3a8c8a4f911def6232dc262f0a310c4583939c6efc5a1c567dbff99b6c99a93f2ba05f9336a60d3fc6c9a74ad2d8d13f4c4fa55d3d8 + "@algolia/client-common": 5.52.1 + checksum: 6446631d19866f781570adaba883e987f538391e66e96ed2fc7449df4b90d557461d5ad733b3c4e96162b7774429bcad0e03643deb0e5cc2f4a90e739073a024 languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-browser-xhr@npm:4.24.0" +"@algolia/requester-common@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/requester-common@npm:4.27.0" + checksum: ed02765be7d7a769c77efe0c418621fbe53c5800d678c7bd7d85c6b9e3eb3fb0009daa9f50d54257eabf39aec9d3da0d8de5e7a51519771cfd51e770be6a328d + languageName: node + linkType: hard + +"@algolia/requester-fetch@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/requester-fetch@npm:5.52.1" dependencies: - "@algolia/requester-common": 4.24.0 - checksum: 7c32d38d6c7a83357f52134f50271f1ee3df63888b28bc53040a3c74ef73458d80efaf44a5943a3769e84737c2ffd0743e1044a3b5e99ce69289f63e22b50f2a + "@algolia/client-common": 5.52.1 + checksum: 625c6d803ba0b2f307da0a12c6a1cef1f3e2ca774be268825a5b00dc37ab33c7533aa153c1ff1c986c9d23788252d48ac8f133cd948c067ecc1c4c61cee6d102 languageName: node linkType: hard -"@algolia/requester-common@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-common@npm:4.24.0" - checksum: 8f4a49ef0fb4aca42fa3703ddf97ff7f6e9c8492928aa66704ca2f54d3785d2338b64917860a01a42dedb1621279558ca7d549c5b1eb5b7f2742f952fb9865e5 +"@algolia/requester-node-http@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/requester-node-http@npm:4.27.0" + dependencies: + "@algolia/requester-common": 4.27.0 + checksum: 4dcce64b4918b9748db8ea97b6b10125269275b800a5cd9d2012aaae5df512ff06d2cba3ca5b69597a91e1bb0cac3d2b276f3858500f4c833ccc1e35871c0cc0 languageName: node linkType: hard -"@algolia/requester-node-http@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/requester-node-http@npm:4.24.0" +"@algolia/requester-node-http@npm:5.52.1": + version: 5.52.1 + resolution: "@algolia/requester-node-http@npm:5.52.1" dependencies: - "@algolia/requester-common": 4.24.0 - checksum: 387ee892bf35f46be269996de88f9ea12841796aa33cb5088ba6460a48733614a33300ee44bca0af22b6fded05c16ec92631fb998e9a7e1e6a30504d8b407c23 + "@algolia/client-common": 5.52.1 + checksum: 436b9bdb8b8d87b83217ecce4560654babc75e10da8a5b2861526a2521ec88b97ee43c3ea7bb43b5f1d66ebe74b6b10dd41f1269305114b12882e8bbb620b4f8 languageName: node linkType: hard -"@algolia/transporter@npm:4.24.0": - version: 4.24.0 - resolution: "@algolia/transporter@npm:4.24.0" +"@algolia/transporter@npm:4.27.0": + version: 4.27.0 + resolution: "@algolia/transporter@npm:4.27.0" dependencies: - "@algolia/cache-common": 4.24.0 - "@algolia/logger-common": 4.24.0 - "@algolia/requester-common": 4.24.0 - checksum: 2c026a777de5dcb6f3cc94a0cf5f4650fbc7067f56eb98a1ae9b5750815179a73eb2b1d8ae75853a99823afd13584b62430d7649c65a456b2623123f355955b1 + "@algolia/cache-common": 4.27.0 + "@algolia/logger-common": 4.27.0 + "@algolia/requester-common": 4.27.0 + checksum: 50217ead18cb5ddbc097a43da2d770787ac8cff8930a3134751739c4666e782611b3bad1401dc912ba71836311ea8d9fdaaf25b50dddde60297c031a67bff7f0 languageName: node linkType: hard @@ -216,7 +370,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.24.7, @babel/code-frame@npm:^7.8.3": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.24.7": version: 7.24.7 resolution: "@babel/code-frame@npm:7.24.7" dependencies: @@ -226,6 +380,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0, @babel/code-frame@npm:^7.8.3": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": ^7.28.5 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 39f5b303757e4d63bbff8133e251094cd4f952b46e3fa9febc7368d907583911d6a1eded6090876dc1feeff5cf6e134fb19b706f8d58d26c5402cd50e5e1aeb2 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.25.2": version: 7.25.2 resolution: "@babel/compat-data@npm:7.25.2" @@ -233,7 +398,14 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.21.3, @babel/core@npm:^7.23.3": +"@babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.3": + version: 7.29.3 + resolution: "@babel/compat-data@npm:7.29.3" + checksum: 977192bab334f66bc8150026340a33ed318c1a7ce18a9323f4c1b86f8ed1d8645bfe5600242bf682717c05c46a4ff06225242207c1d599f4296914b9b4e3efb5 + languageName: node + linkType: hard + +"@babel/core@npm:^7.21.3": version: 7.25.2 resolution: "@babel/core@npm:7.25.2" dependencies: @@ -256,7 +428,43 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.25.0": +"@babel/core@npm:^7.23.3": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helpers": ^7.28.6 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/remapping": ^2.3.5 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 85e1df6e213382c46dee27bcd07ed9202fa108a85bb74eb37be656308fd949349171ad2aa17cc84cf0720c908dc9ea6309d25e64d2a7fcdaa63721ce0c67c10b + languageName: node + linkType: hard + +"@babel/generator@npm:^7.23.3, @babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" + dependencies: + "@babel/parser": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 + jsesc: ^3.0.2 + checksum: d8e6863b2d04f684e65ad72731049ac7d754d3a3d1a67cdfc20807b109ba3180ed90d7ccef58ce5d38ded2eaeb71983a76c711eecb9b6266118262378f6c7226 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.0": version: 7.25.0 resolution: "@babel/generator@npm:7.25.0" dependencies: @@ -277,6 +485,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" + dependencies: + "@babel/types": ^7.27.3 + checksum: 63863a5c936ef82b546ca289c9d1b18fabfc24da5c4ee382830b124e2e79b68d626207febc8d4bffc720f50b2ee65691d7d12cc0308679dee2cd6bdc926b7190 + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" @@ -300,6 +517,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" + dependencies: + "@babel/compat-data": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + browserslist: ^4.24.0 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 8151e36b74eb1c5e414fe945c189436421f7bfa011884de5be3dd7fd77f12f1f733ff7c982581dfa0a49d8af724450243c2409427114b4a6cfeb8333259d001c + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.24.7, @babel/helper-create-class-features-plugin@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helper-create-class-features-plugin@npm:7.25.0" @@ -317,6 +547,23 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.29.3 + resolution: "@babel/helper-create-class-features-plugin@npm:7.29.3" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-member-expression-to-functions": ^7.28.5 + "@babel/helper-optimise-call-expression": ^7.27.1 + "@babel/helper-replace-supers": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + "@babel/traverse": ^7.29.0 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ed7e755d83a59679ea9554b733e2f4b41fd1dd68ef4d8d3e5009930d8ff323f7aabdb8577abea0d98e5cc62a7ce5d14aca501e4446ccfe397c6c2fa3d8164f4b + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7, @babel/helper-create-regexp-features-plugin@npm:^7.25.0": version: 7.25.2 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2" @@ -330,6 +577,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + regexpu-core: ^6.3.1 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: de202103e6ff8cd8da0d62eb269fcceb29857f3fa16173f0ff38188fd514e9ad4901aef1d590ff8ba25381644b42eaf70ad9ba91fda59fe7aa6a5e694cdde267 + languageName: node + linkType: hard + "@babel/helper-define-polyfill-provider@npm:^0.6.2": version: 0.6.2 resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" @@ -345,6 +605,28 @@ __metadata: languageName: node linkType: hard +"@babel/helper-define-polyfill-provider@npm:^0.6.5, @babel/helper-define-polyfill-provider@npm:^0.6.8": + version: 0.6.8 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.8" + dependencies: + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + debug: ^4.4.3 + lodash.debounce: ^4.0.8 + resolve: ^1.22.11 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 39fef64ade79253836320c7826895d948ab5e8e21479cf29f5d6bb5284126693ca537b6ace9d9b7b515a8be66bd4a8a7d7687f9b25b7574a52dae7790fcd3a4e + languageName: node + linkType: hard + +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: d8d7b91c12dad1ee747968af0cb73baf91053b2bcf78634da2c2c4991fb45ede9bd0c8f9b5f3254881242bc0921218fcb7c28ae885477c25177147e978ce4397 + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8" @@ -355,6 +637,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" + dependencies: + "@babel/traverse": ^7.28.5 + "@babel/types": ^7.28.5 + checksum: 447d385233bae2eea713df1785f819b5a5ca272950740da123c42d23f491045120f0fbbb5609c091f7a9bbd40f289a442846dde0cb1bf0c59440fa093690cf7c + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-module-imports@npm:7.24.7" @@ -365,7 +657,17 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.0, @babel/helper-module-transforms@npm:^7.25.2": +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" + dependencies: + "@babel/traverse": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 437513aa029898b588a38f7991d7656c539b22f595207d85d0c407240c9e3f2aff8b9d0d7115fdedc91e7fdce4465100549a052024e2fba6a810bcbb7584296b + languageName: node + linkType: hard + +"@babel/helper-module-transforms@npm:^7.24.7, @babel/helper-module-transforms@npm:^7.24.8, @babel/helper-module-transforms@npm:^7.25.2": version: 7.25.2 resolution: "@babel/helper-module-transforms@npm:7.25.2" dependencies: @@ -379,6 +681,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" + dependencies: + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 522f7d1d08b5e2ccd4ec912aca879bd1506af78d1fb30f46e3e6b4bb69c6ae6ab4e379a879723844230d27dc6d04a55b03f5215cd3141b7a2b40bb4a02f71a9f + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" @@ -388,6 +703,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" + dependencies: + "@babel/types": ^7.27.1 + checksum: 0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.24.8 resolution: "@babel/helper-plugin-utils@npm:7.24.8" @@ -395,6 +719,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: a0b4caab5e2180b215faa4d141ceac9e82fad9d446b8023eaeb8d82a6e62024726675b07fe8e616dd12f34e2bb59747e8d57aa8adab3e0717d1b8d691b118379 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.24.7, @babel/helper-remap-async-to-generator@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helper-remap-async-to-generator@npm:7.25.0" @@ -408,6 +739,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-wrap-function": ^7.27.1 + "@babel/traverse": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc + languageName: node + linkType: hard + "@babel/helper-replace-supers@npm:^7.24.7, @babel/helper-replace-supers@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helper-replace-supers@npm:7.25.0" @@ -421,6 +765,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" + dependencies: + "@babel/helper-member-expression-to-functions": ^7.28.5 + "@babel/helper-optimise-call-expression": ^7.27.1 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: aa6530a52010883b6be88465e3b9e789509786a40203650a23a51c315f7442b196e5925fb8e2d66d1e3dc2c604cdc817bd8c5c170dbb322ab5ebc7486fd8a022 + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-simple-access@npm:7.24.7" @@ -441,6 +798,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" + dependencies: + "@babel/traverse": ^7.27.1 + "@babel/types": ^7.27.1 + checksum: 4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-string-parser@npm:7.24.8" @@ -448,6 +815,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 0a8464adc4b39b138aedcb443b09f4005d86207d7126e5e079177e05c3116107d856ec08282b365e9a79a9872f40f4092a6127f8d74c8a01c1ef789dacfc25d6 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.24.7": version: 7.24.7 resolution: "@babel/helper-validator-identifier@npm:7.24.7" @@ -455,6 +829,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 5a251a6848e9712aea0338f659a1a3bd334d26219d5511164544ca8ec20774f098c3a6661e9da65a0d085c745c00bb62c8fada38a62f08fa1f8053bc0aeb57e4 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.24.7, @babel/helper-validator-option@npm:^7.24.8": version: 7.24.8 resolution: "@babel/helper-validator-option@npm:7.24.8" @@ -462,6 +843,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helper-wrap-function@npm:7.25.0" @@ -473,6 +861,17 @@ __metadata: languageName: node linkType: hard +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/helper-wrap-function@npm:7.28.6" + dependencies: + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 1281f45d55ff291711de7cf05b8132fc28b8d2b30c6c9cf8fce68669bbe318503ed485057d434efa1a4f91ab55d62bf8f3ecb0a889a9f81d357ad4614cd0fa6c + languageName: node + linkType: hard + "@babel/helpers@npm:^7.25.0": version: 7.25.0 resolution: "@babel/helpers@npm:7.25.0" @@ -483,6 +882,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.28.6": + version: 7.29.2 + resolution: "@babel/helpers@npm:7.29.2" + dependencies: + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + checksum: 2c8ce711a639ef334539d3bd48977f57493f71af99e13d3f685fe47b3bc32aa83dbc1380688e19d5df924d958f8f29072f3dcff8110257ba6399524907287189 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.24.7": version: 7.24.7 resolution: "@babel/highlight@npm:7.24.7" @@ -506,6 +915,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.3 + resolution: "@babel/parser@npm:7.29.3" + dependencies: + "@babel/types": ^7.29.0 + bin: + parser: ./bin/babel-parser.js + checksum: 046f46996bf4053b6e29f8a7f420f9e0a2878593c1c9a9914a36faca23fc544a307c78a0101ba3ae98936ade68bdde686a83e1ab2b74c2ebb80dc4a9df48476d + languageName: node + linkType: hard + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.3": version: 7.25.3 resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.3" @@ -518,6 +938,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.5 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 749b40a963d5633f554cad0336245cb6c1c1393c70a3fddcf302d86a1a42b35efdd2ed62056b88db66f3900887ae1cee9a3eeec89799c22e0cf65059f0dfd142 + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.0" @@ -529,6 +961,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.0" @@ -540,6 +983,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 + languageName: node + linkType: hard + +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@npm:^7.29.3": + version: 7.29.3 + resolution: "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@npm:7.29.3" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: fd13198afc9b72c6a4e4868f1592fc8010f390e7601148a71d2d6111664c0242d6d5ff27d8eb77ca4c35ef47f8416daf5dbc8d46a498ac706d69c6b3a0988cd7 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" @@ -553,6 +1019,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + "@babel/plugin-transform-optional-chaining": ^7.27.1 + peerDependencies: + "@babel/core": ^7.13.0 + checksum: f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 + languageName: node + linkType: hard + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.0" @@ -565,6 +1044,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f1341f829f809c8685d839669953a478f8a40d1d53f4f5e1972bf39ff4e1ece148319340292d6e0c3641157268b435cbb99b3ac2f3cefe9fca9e81b8f62d6d71 + languageName: node + linkType: hard + "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": version: 7.21.0-placeholder-for-preset-env.2 resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" @@ -640,6 +1131,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 25017235e1e2c4ed892aa327a3fa10f4209cc618c6dd7806fc40c07d8d7d24a39743d3d5568b8d1c8f416cffe03c174e78874ded513c9338b07a7ab1dcbab050 + languageName: node + linkType: hard + "@babel/plugin-syntax-import-attributes@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" @@ -651,6 +1153,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 6c8c6a5988dbb9799d6027360d1a5ba64faabf551f2ef11ba4eade0c62253b5c85d44ddc8eb643c74b9acb2bcaa664a950bd5de9a5d4aef291c4f2a48223bb4b + languageName: node + linkType: hard + "@babel/plugin-syntax-import-meta@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" @@ -684,6 +1197,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 572e38f5c1bb4b8124300e7e3dd13e82ae84a21f90d3f0786c98cd05e63c78ca1f32d1cfe462dfbaf5e7d5102fa7cd8fd741dfe4f3afc2e01a3b2877dcc8c866 + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -783,6 +1307,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -806,6 +1341,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 + languageName: node + linkType: hard + "@babel/plugin-transform-async-generator-functions@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-transform-async-generator-functions@npm:7.25.0" @@ -820,6 +1366,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-remap-async-to-generator": ^7.27.1 + "@babel/traverse": ^7.29.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bd549b54283034dd3e2f6c4b41b99a0caba0ddc8e9418490a611136ddb01e62235f14b233fcc172902fd1d18eec6e029245d22212566ea5cb5e24c7450d6005d + languageName: node + linkType: hard + "@babel/plugin-transform-async-to-generator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" @@ -833,6 +1392,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" + dependencies: + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-remap-async-to-generator": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bca5774263ec01dd2bf71c74bbaf7baa183bf03576636b7826c3346be70c8c8cb15cff549112f2983c36885131a0afde6c443591278c281f733ee17f455aa9b1 + languageName: node + linkType: hard + "@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" @@ -844,9 +1416,20 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 + languageName: node + linkType: hard + +"@babel/plugin-transform-block-scoping@npm:^7.25.0": + version: 7.25.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.25.0" dependencies: "@babel/helper-plugin-utils": ^7.24.8 peerDependencies: @@ -855,6 +1438,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: cb4f71ac4fc7b32c2e3cc167eb9e7a1a11562127d702e3b5093567750e9a4eb11a29ae5a917f62741bf9d5792bfe3022cbcdcc7bb927ddb6f627b6749a38c118 + languageName: node + linkType: hard + "@babel/plugin-transform-class-properties@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" @@ -867,6 +1461,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc + languageName: node + linkType: hard + "@babel/plugin-transform-class-static-block@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" @@ -880,6 +1486,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.12.0 + checksum: 3db326156f73a0c0d1e2ea4d73e082b9ace2f6a9c965db1c2e51f3a186751b8b91bafb184d05e046bf970b50ecfde1f74862dd895f9a5ea0fad328369d74cfc4 + languageName: node + linkType: hard + "@babel/plugin-transform-classes@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-transform-classes@npm:7.25.0" @@ -896,6 +1514,22 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-globals": ^7.28.0 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-replace-supers": ^7.28.6 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: bddeefbfd1966272e5da6a0844d68369a0f43c286816c8b379dfd576cf835b8bc652089ef337b0334ff3ae6c9652d56d8332b78a7d29176534265c39856e4822 + languageName: node + linkType: hard + "@babel/plugin-transform-computed-properties@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" @@ -908,6 +1542,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/template": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fd1fcc55003a2584c7461bf214ae9e9fce370ad09339319e99e29e5e55a8a3bd485d10805b3d69636a738208761b3a5b0dafdd023534396be45a36409082b014 + languageName: node + linkType: hard + "@babel/plugin-transform-destructuring@npm:^7.24.8": version: 7.24.8 resolution: "@babel/plugin-transform-destructuring@npm:7.24.8" @@ -919,6 +1565,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.28.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 74a06e55e715cfda0fdd8be53d2655d64dfdc28dffaede329d42548fd5b1449ad26a4ce43a24c3fd277b96f8b2010c7b3915afa8297911cda740cc5cc3a81f38 + languageName: node + linkType: hard + "@babel/plugin-transform-dotall-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" @@ -931,6 +1589,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 866ffbbdee77fa955063b37c75593db8dbbe46b1ebb64cc788ea437e3a9aa41cb7b9afcee617c678a32b6705baa0892ec8e5d4b8af3bbb0ab1b254514ccdbd37 + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-keys@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" @@ -942,6 +1612,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ef2112d658338e3ff0827f39a53c0cfa211f1cbbe60363bca833a5269df389598ec965e7283600b46533c39cdca82307d0d69c0f518290ec5b00bb713044715b + languageName: node + linkType: hard + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.0": version: 7.25.0 resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.0" @@ -954,6 +1635,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 7fa7b773259a578c9e01c80946f75ecc074520064aa7a87a65db06c7df70766e2fa6be78cda55fa9418a14e30b2b9d595484a46db48074d495d9f877a4276065 + languageName: node + linkType: hard + "@babel/plugin-transform-dynamic-import@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" @@ -966,6 +1659,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 + languageName: node + linkType: hard + +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: be65403694d360793b1b626ac0dfa7c120cfe4dd1c95a81a30b6e7426dc317643e60a486d642e318a4d3d9a7193e72fdb36e2ec140c25c773dcb9c3b1e2854ef + languageName: node + linkType: hard + "@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" @@ -978,6 +1694,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b232152499370435c7cd4bf3321f58e189150e35ca3722ea16533d33434b97294df1342f5499671ec48e62b71c34cdea0ca8cf317ad12594a10f6fc670315e62 + languageName: node + linkType: hard + "@babel/plugin-transform-export-namespace-from@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" @@ -990,6 +1717,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 + languageName: node + linkType: hard + "@babel/plugin-transform-for-of@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-for-of@npm:7.24.7" @@ -1002,6 +1740,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: c9224e08de5d80b2c834383d4359aa9e519db434291711434dd996a4f86b7b664ad67b45d65459b7ec11fa582e3e11a3c769b8a8ca71594bdd4e2f0503f84126 + languageName: node + linkType: hard + "@babel/plugin-transform-function-name@npm:^7.25.1": version: 7.25.1 resolution: "@babel/plugin-transform-function-name@npm:7.25.1" @@ -1015,6 +1765,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" + dependencies: + "@babel/helper-compilation-targets": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/traverse": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 + languageName: node + linkType: hard + "@babel/plugin-transform-json-strings@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" @@ -1027,6 +1790,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 69d82a1a0a72ed6e6f7969e09cf330516599d79b2b4e680e9dd3c57616a8c6af049b5103456e370ab56642815e80e46ed88bb81e9e059304a85c5fe0bf137c29 + languageName: node + linkType: hard + "@babel/plugin-transform-literals@npm:^7.25.2": version: 7.25.2 resolution: "@babel/plugin-transform-literals@npm:7.25.2" @@ -1038,6 +1812,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 + languageName: node + linkType: hard + "@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" @@ -1050,6 +1835,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 36095d5d1cfc680e95298b5389a16016da800ae3379b130dabf557e94652c47b06610407e9fa44aaa03e9b0a5aa7b4b93348123985d44a45e369bf5f3497d149 + languageName: node + linkType: hard + "@babel/plugin-transform-member-expression-literals@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" @@ -1061,6 +1857,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-amd@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" @@ -1073,6 +1880,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8bb36d448e438d5d30f4faf19120e8c18aa87730269e65d805bf6032824d175ed738057cc392c2c8a650028f1ae0f346cad8d6b723f31a037b586e2092a7be18 + languageName: node + linkType: hard + "@babel/plugin-transform-modules-commonjs@npm:^7.24.7, @babel/plugin-transform-modules-commonjs@npm:^7.24.8": version: 7.24.8 resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.8" @@ -1086,17 +1905,29 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.0": - version: 7.25.0 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.0" +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1, @babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": ^7.25.0 - "@babel/helper-plugin-utils": ^7.24.8 - "@babel/helper-validator-identifier": ^7.24.7 - "@babel/traverse": ^7.25.0 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: fe673bec08564e491847324bb80a1e6edfb229f5c37e58a094d51e95306e7b098e1d130fc43e992d22debd93b9beac74441ffc3f6ea5d78f6b2535896efa0728 + checksum: b48cab26fda72894c7002a9c783befbc8a643d827c52bdcc5adf83e418ca93224a15aaf7ed2d1e6284627be55913696cfa2119242686cfa77a473bf79314df26 + languageName: node + linkType: hard + +"@babel/plugin-transform-modules-systemjs@npm:^7.25.0, @babel/plugin-transform-modules-systemjs@npm:^7.29.4": + version: 7.29.4 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.4" + dependencies: + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.29.0 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d9cbb30669077756048af990a08ad1ba149785c336024affa49848dc4ffc5948bfaaf52d90bbec711a1f320e19e2c60182dbeff40d81cc5b9a09a87919abe07d languageName: node linkType: hard @@ -1112,6 +1943,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" + dependencies: + "@babel/helper-module-transforms": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b007dd89231f2eeccf1c71a85629bcb692573303977a4b1c5f19a835ea6b5142c18ef07849bc6d752b874a11bc0ddf3c67468b77c8ee8310290b688a4f01ef31 + languageName: node + linkType: hard + "@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" @@ -1124,6 +1967,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: ed8c27699ca82a6c01cbfd39f3de16b90cfea4f8146a358057f76df290d308a66a8bd2e6734e6a87f68c18576e15d2d70548a84cd474d26fdf256c3f5ae44d8c + languageName: node + linkType: hard + "@babel/plugin-transform-new-target@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-new-target@npm:7.24.7" @@ -1135,6 +1990,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 32c8078d843bda001244509442d68fd3af088d7348ba883f45c262b2c817a27ffc553b0d78e7f7a763271b2ece7fac56151baad7a91fb21f5bb1d2f38e5acad7 + languageName: node + linkType: hard + "@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" @@ -1147,6 +2013,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 1cdd3ca48a8fffa13dbb9949748d3dd2183cf24110cd55d702da4549205611fc12978b49886be809ec1929ff6304ac4eecc747a33dca2484f9dc655928ab5a89 + languageName: node + linkType: hard + "@babel/plugin-transform-numeric-separator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" @@ -1159,6 +2036,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4b5ca60e481e22f0842761a3badca17376a230b5a7e5482338604eb95836c2d0c9c9bde53bdc5c2de1c6a12ae6c12de7464d098bf74b0943f85905ca358f0b68 + languageName: node + linkType: hard + "@babel/plugin-transform-object-rest-spread@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" @@ -1173,6 +2061,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" + dependencies: + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ab85b1321f86db91aba22ad9d8e6ab65448c983214998012229f5302468527d27b908ad6b14755991c317e35d2f54ec8459a2a094a755999651fe0ac9bd2e9a6 + languageName: node + linkType: hard + "@babel/plugin-transform-object-super@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-object-super@npm:7.24.7" @@ -1185,6 +2088,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-replace-supers": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" @@ -1197,6 +2112,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 + languageName: node + linkType: hard + "@babel/plugin-transform-optional-chaining@npm:^7.24.7, @babel/plugin-transform-optional-chaining@npm:^7.24.8": version: 7.24.8 resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8" @@ -1210,6 +2136,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a40dbe709671a436bb69e14524805e10af81b44c422e4fc5dc905cb91adb92d650c9d266c3c2c0da0d410dea89ce784995d4118b7ab6a7544f4923e61590b386 + languageName: node + linkType: hard + "@babel/plugin-transform-parameters@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-parameters@npm:7.24.7" @@ -1221,6 +2159,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d51f195e1d6ac5d9fce583e9a70a5bfe403e62386e5eb06db9fbc6533f895a98ff7e7c3dcaa311a8e6fa7a9794466e81cdabcba6af9f59d787fb767bfe7868b4 + languageName: node + linkType: hard + "@babel/plugin-transform-private-methods@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" @@ -1233,6 +2182,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" + dependencies: + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b80179b28f6a165674d0b0d6c6349b13a01dd282b18f56933423c0a33c23fc0626c8f011f859fc20737d021fe966eb8474a5233e4596401482e9ee7fb00e2aa2 + languageName: node + linkType: hard + "@babel/plugin-transform-private-property-in-object@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" @@ -1247,6 +2208,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 32a935e44872e90607851be5bc2cd3365f29c0e0e3853ef3e2b6a7da4d08c647379bf2f2dc4f14a9064d7d72e2cf75da85e55baeeec1ffc25cf6088fe24422f7 + languageName: node + linkType: hard + "@babel/plugin-transform-property-literals@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" @@ -1258,6 +2232,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb + languageName: node + linkType: hard + "@babel/plugin-transform-react-constant-elements@npm:^7.21.3": version: 7.25.1 resolution: "@babel/plugin-transform-react-constant-elements@npm:7.25.1" @@ -1280,6 +2265,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-display-name@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 268b1a9192974439d17949e170b01cac2a2aa003c844e2fe3b8361146f42f66487178cffdfa8ce862aa9e6c814bc37f879a70300cb3f067815d15fa6aad04e6d + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-development@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" @@ -1291,6 +2287,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" + dependencies: + "@babel/plugin-transform-react-jsx": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx@npm:^7.24.7": version: 7.25.2 resolution: "@babel/plugin-transform-react-jsx@npm:7.25.2" @@ -1306,6 +2313,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-jsx@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/plugin-syntax-jsx": ^7.28.6 + "@babel/types": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e7d093b5ed6c06563e801d44d1212b451445d7600756efd7b8b8e6db4585c27fa8145176dcb3350968c59381af6c566dae9b6dc97ec15d2837493b238904d1c2 + languageName: node + linkType: hard + "@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" @@ -1318,6 +2340,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c + languageName: node + linkType: hard + "@babel/plugin-transform-regenerator@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" @@ -1330,6 +2364,29 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: f48bc814f11239f2bfe010a6e29d5ac2443e7b1d8004e7c022effa111b743491127acf8644cfef475edb86b91f123829585867bc13762652aabd9b85ed6ce61e + languageName: node + linkType: hard + +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 5aacc570034c085afa0165137bb9a04cd4299b86eb9092933a96dcc1132c8f591d9d534419988f5f762b2f70d43a3c719a6b8fa05fdd3b2b1820d01cf85500da + languageName: node + linkType: hard + "@babel/plugin-transform-reserved-words@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" @@ -1341,19 +2398,30 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-runtime@npm:^7.22.9": - version: 7.24.7 - resolution: "@babel/plugin-transform-runtime@npm:7.24.7" +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" dependencies: - "@babel/helper-module-imports": ^7.24.7 - "@babel/helper-plugin-utils": ^7.24.7 - babel-plugin-polyfill-corejs2: ^0.4.10 - babel-plugin-polyfill-corejs3: ^0.10.1 - babel-plugin-polyfill-regenerator: ^0.6.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b + languageName: node + linkType: hard + +"@babel/plugin-transform-runtime@npm:^7.22.9": + version: 7.29.0 + resolution: "@babel/plugin-transform-runtime@npm:7.29.0" + dependencies: + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + babel-plugin-polyfill-corejs2: ^0.4.14 + babel-plugin-polyfill-corejs3: ^0.13.0 + babel-plugin-polyfill-regenerator: ^0.6.5 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 98bcbbdc833d5c451189a6325f88820fe92973e119c59ce74bf28681cf4687c8280decb55b6c47f22e98c3973ae3a13521c4f51855a2b8577b230ecb1b4ca5b4 + checksum: 1d3a5951396469372d954538fb188479b86afa8e02ca541da8f123250aaed8df65573b68f67087f4b15a5ccff9abc3a3fdb1d9a07fbb85bfcb807168d7364a37 languageName: node linkType: hard @@ -1368,6 +2436,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 + languageName: node + linkType: hard + "@babel/plugin-transform-spread@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-spread@npm:7.24.7" @@ -1380,6 +2459,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" + dependencies: + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e4782578904df68f7d2b3e865f20701c71d6aba0027c4794c1dc08a2f805a12892a078dab483714552398a689ad4ff6786cdf4e088b073452aee7db67e37a09c + languageName: node + linkType: hard + "@babel/plugin-transform-sticky-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" @@ -1391,6 +2482,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 + languageName: node + linkType: hard + "@babel/plugin-transform-template-literals@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" @@ -1402,6 +2504,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce + languageName: node + linkType: hard + "@babel/plugin-transform-typeof-symbol@npm:^7.24.8": version: 7.24.8 resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.8" @@ -1413,6 +2526,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: ed8048c8de72c60969a64cf2273cc6d9275d8fa8db9bd25a1268273a00fb9cbd79931140311411bda1443aa56cb3961fb911d1795abacde7f0482f1d8fdf0356 + languageName: node + linkType: hard + "@babel/plugin-transform-typescript@npm:^7.24.7": version: 7.25.2 resolution: "@babel/plugin-transform-typescript@npm:7.25.2" @@ -1428,6 +2552,21 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.28.5": + version: 7.28.6 + resolution: "@babel/plugin-transform-typescript@npm:7.28.6" + dependencies: + "@babel/helper-annotate-as-pure": ^7.27.3 + "@babel/helper-create-class-features-plugin": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-skip-transparent-expression-wrappers": ^7.27.1 + "@babel/plugin-syntax-typescript": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 029add39a37e4a1960a43c3a109680462f631bc63cc8457ea65add2cce3271c9fd4d6a1782177c65ea5f77731e2f8e2bc65a9aec9cc826346ba540ecd0b97e5a + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" @@ -1439,6 +2578,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d817154bc10758ddd85b716e0bc1af1a1091e088400289ab6b78a1a4d609907ce3d2f1fd51a6fd0e0c8ecbb5f8e3aab4957e0747776d132d2379e85c3ef0520a + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" @@ -1451,6 +2601,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d14e8c51aa73f592575c1543400fd67d96df6410d75c9dc10dd640fd7eecb37366a2f2368bbdd7529842532eda4af181c921bda95146c6d373c64ea59c6e9991 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" @@ -1463,6 +2625,18 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.27.1 + "@babel/helper-plugin-utils": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": version: 7.24.7 resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" @@ -1475,7 +2649,19 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.22.9": +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" + dependencies: + "@babel/helper-create-regexp-features-plugin": ^7.28.5 + "@babel/helper-plugin-utils": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 423971fe2eef9d18782b1c30f5f42613ee510e5b9c08760c5538a0997b36c34495acce261e0e37a27831f81330359230bd1f33c2e1822de70241002b45b7d68e + languageName: node + linkType: hard + +"@babel/preset-env@npm:^7.20.2": version: 7.25.3 resolution: "@babel/preset-env@npm:7.25.3" dependencies: @@ -1568,6 +2754,87 @@ __metadata: languageName: node linkType: hard +"@babel/preset-env@npm:^7.22.9": + version: 7.29.5 + resolution: "@babel/preset-env@npm:7.29.5" + dependencies: + "@babel/compat-data": ^7.29.3 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-plugin-utils": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ^7.28.5 + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ^7.27.1 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.27.1 + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": ^7.29.3 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.27.1 + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ^7.28.6 + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 + "@babel/plugin-syntax-import-assertions": ^7.28.6 + "@babel/plugin-syntax-import-attributes": ^7.28.6 + "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 + "@babel/plugin-transform-arrow-functions": ^7.27.1 + "@babel/plugin-transform-async-generator-functions": ^7.29.0 + "@babel/plugin-transform-async-to-generator": ^7.28.6 + "@babel/plugin-transform-block-scoped-functions": ^7.27.1 + "@babel/plugin-transform-block-scoping": ^7.28.6 + "@babel/plugin-transform-class-properties": ^7.28.6 + "@babel/plugin-transform-class-static-block": ^7.28.6 + "@babel/plugin-transform-classes": ^7.28.6 + "@babel/plugin-transform-computed-properties": ^7.28.6 + "@babel/plugin-transform-destructuring": ^7.28.5 + "@babel/plugin-transform-dotall-regex": ^7.28.6 + "@babel/plugin-transform-duplicate-keys": ^7.27.1 + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-dynamic-import": ^7.27.1 + "@babel/plugin-transform-explicit-resource-management": ^7.28.6 + "@babel/plugin-transform-exponentiation-operator": ^7.28.6 + "@babel/plugin-transform-export-namespace-from": ^7.27.1 + "@babel/plugin-transform-for-of": ^7.27.1 + "@babel/plugin-transform-function-name": ^7.27.1 + "@babel/plugin-transform-json-strings": ^7.28.6 + "@babel/plugin-transform-literals": ^7.27.1 + "@babel/plugin-transform-logical-assignment-operators": ^7.28.6 + "@babel/plugin-transform-member-expression-literals": ^7.27.1 + "@babel/plugin-transform-modules-amd": ^7.27.1 + "@babel/plugin-transform-modules-commonjs": ^7.28.6 + "@babel/plugin-transform-modules-systemjs": ^7.29.4 + "@babel/plugin-transform-modules-umd": ^7.27.1 + "@babel/plugin-transform-named-capturing-groups-regex": ^7.29.0 + "@babel/plugin-transform-new-target": ^7.27.1 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.28.6 + "@babel/plugin-transform-numeric-separator": ^7.28.6 + "@babel/plugin-transform-object-rest-spread": ^7.28.6 + "@babel/plugin-transform-object-super": ^7.27.1 + "@babel/plugin-transform-optional-catch-binding": ^7.28.6 + "@babel/plugin-transform-optional-chaining": ^7.28.6 + "@babel/plugin-transform-parameters": ^7.27.7 + "@babel/plugin-transform-private-methods": ^7.28.6 + "@babel/plugin-transform-private-property-in-object": ^7.28.6 + "@babel/plugin-transform-property-literals": ^7.27.1 + "@babel/plugin-transform-regenerator": ^7.29.0 + "@babel/plugin-transform-regexp-modifiers": ^7.28.6 + "@babel/plugin-transform-reserved-words": ^7.27.1 + "@babel/plugin-transform-shorthand-properties": ^7.27.1 + "@babel/plugin-transform-spread": ^7.28.6 + "@babel/plugin-transform-sticky-regex": ^7.27.1 + "@babel/plugin-transform-template-literals": ^7.27.1 + "@babel/plugin-transform-typeof-symbol": ^7.27.1 + "@babel/plugin-transform-unicode-escapes": ^7.27.1 + "@babel/plugin-transform-unicode-property-regex": ^7.28.6 + "@babel/plugin-transform-unicode-regex": ^7.27.1 + "@babel/plugin-transform-unicode-sets-regex": ^7.28.6 + "@babel/preset-modules": 0.1.6-no-external-plugins + babel-plugin-polyfill-corejs2: ^0.4.15 + babel-plugin-polyfill-corejs3: ^0.14.0 + babel-plugin-polyfill-regenerator: ^0.6.6 + core-js-compat: ^3.48.0 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 4241d9aa5488dc6df958fe866b747fcd2fd1c1385e95e05900bc6377b1c976cb5bc2057200e8a6c1f76dc99566983e27db927b768df09d7617f61d133f760b1a + languageName: node + linkType: hard + "@babel/preset-modules@npm:0.1.6-no-external-plugins": version: 0.1.6-no-external-plugins resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" @@ -1581,7 +2848,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.22.5": +"@babel/preset-react@npm:^7.18.6": version: 7.24.7 resolution: "@babel/preset-react@npm:7.24.7" dependencies: @@ -1597,7 +2864,23 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.22.5": +"@babel/preset-react@npm:^7.22.5": + version: 7.28.5 + resolution: "@babel/preset-react@npm:7.28.5" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-transform-react-display-name": ^7.28.0 + "@babel/plugin-transform-react-jsx": ^7.27.1 + "@babel/plugin-transform-react-jsx-development": ^7.27.1 + "@babel/plugin-transform-react-pure-annotations": ^7.27.1 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 13bc1fe4dde0a29d00323e46749e5beb457844507cb3afa2fefbd85d283c2d4836f9e4a780be735de58a44c505870476dc2838f1f8faf9d6f056481e65f1a0fb + languageName: node + linkType: hard + +"@babel/preset-typescript@npm:^7.21.0": version: 7.24.7 resolution: "@babel/preset-typescript@npm:7.24.7" dependencies: @@ -1612,6 +2895,21 @@ __metadata: languageName: node linkType: hard +"@babel/preset-typescript@npm:^7.22.5": + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" + dependencies: + "@babel/helper-plugin-utils": ^7.27.1 + "@babel/helper-validator-option": ^7.27.1 + "@babel/plugin-syntax-jsx": ^7.27.1 + "@babel/plugin-transform-modules-commonjs": ^7.27.1 + "@babel/plugin-transform-typescript": ^7.28.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 22f889835d9db1e627846e71ca2f02e2d24e2eb9ebcf9845b3b1d37bd3a53787967bafabbbcb342f06aaf7627399a7102ba6ca18f9a0e17066c865d680d2ceb9 + languageName: node + linkType: hard + "@babel/regjsgen@npm:^0.8.0": version: 0.8.0 resolution: "@babel/regjsgen@npm:0.8.0" @@ -1620,16 +2918,15 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.22.6": - version: 7.25.0 - resolution: "@babel/runtime-corejs3@npm:7.25.0" + version: 7.29.2 + resolution: "@babel/runtime-corejs3@npm:7.29.2" dependencies: - core-js-pure: ^3.30.2 - regenerator-runtime: ^0.14.0 - checksum: fb23e5afc7b9077f7cec3f17b58d63154a9f329b6746f8296e7b60ade07b4d7d67a90b23bd7196e7d207e8105dd1b847d1b22a0af5a1c681365004cd63244f63 + core-js-pure: ^3.48.0 + checksum: 950b38dce3814c076ebd97ed6b6dbe7d4dd165d32429208d954134df5e221e060320935e5d2316f6172355070056b87eb24b0c2b099f5aa1a6a81ae549a84a36 languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.22.6, @babel/runtime@npm:^7.8.4": +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.8.4": version: 7.25.0 resolution: "@babel/runtime@npm:7.25.0" dependencies: @@ -1638,6 +2935,13 @@ __metadata: languageName: node linkType: hard +"@babel/runtime@npm:^7.22.6": + version: 7.29.2 + resolution: "@babel/runtime@npm:7.29.2" + checksum: d5548d1165de8995f8afc93a5694b8625409be16cd1f2250ac13e331335858ddac3cb9fd278e6c43956a130101a2203f09417938a1a96f9fb70f02b4b4172e1d + languageName: node + linkType: hard + "@babel/template@npm:^7.24.7, @babel/template@npm:^7.25.0": version: 7.25.0 resolution: "@babel/template@npm:7.25.0" @@ -1649,7 +2953,33 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" + dependencies: + "@babel/code-frame": ^7.28.6 + "@babel/parser": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 8ab6383053e226025d9491a6e795293f2140482d14f60c1244bece6bf53610ed1e251d5e164de66adab765629881c7d9416e1e540c716541d2fd0f8f36a013d7 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + debug: ^4.3.1 + checksum: fbb5085aa525b5d4ecd9fe2f5885d88413fff6ad9c0fac244c37f96069b6d3af9ce825750cd16af1d97d26fa3d354b38dbbdb5f31430e0d99ed89660ab65430e + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.1, @babel/traverse@npm:^7.25.2, @babel/traverse@npm:^7.25.3": version: 7.25.3 resolution: "@babel/traverse@npm:7.25.3" dependencies: @@ -1675,6 +3005,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" + dependencies: + "@babel/helper-string-parser": ^7.27.1 + "@babel/helper-validator-identifier": ^7.28.5 + checksum: 83f190438e94c22b2574aaeef7501830311ef266eaabfb06523409f64e2fe855e522951607085d71cad286719adef14e1ba37b671f334a7cd25b0f8506a01e0b + languageName: node + linkType: hard + "@colors/colors@npm:1.5.0": version: 1.5.0 resolution: "@colors/colors@npm:1.5.0" @@ -1689,25 +3029,25 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.6.1": - version: 3.6.1 - resolution: "@docsearch/css@npm:3.6.1" - checksum: 313ca5a0394485d73b8be73ab2119913b68cf8f446e22a4b1a965123c34aba5a130f4dc5af7ec6880126a220d6040439bb95c11b163c4569f6e2ae18d89b4c3d +"@docsearch/css@npm:3.9.0": + version: 3.9.0 + resolution: "@docsearch/css@npm:3.9.0" + checksum: 8e6f5a995d17881c76b31e5364274b3387917ccbc417ba183009f2655dd507244f7009d27807675f09011efcd8e13d80505e7e17eff1a5d93bcd71324a5fc262 languageName: node linkType: hard "@docsearch/react@npm:^3.5.2": - version: 3.6.1 - resolution: "@docsearch/react@npm:3.6.1" + version: 3.9.0 + resolution: "@docsearch/react@npm:3.9.0" dependencies: - "@algolia/autocomplete-core": 1.9.3 - "@algolia/autocomplete-preset-algolia": 1.9.3 - "@docsearch/css": 3.6.1 - algoliasearch: ^4.19.1 + "@algolia/autocomplete-core": 1.17.9 + "@algolia/autocomplete-preset-algolia": 1.17.9 + "@docsearch/css": 3.9.0 + algoliasearch: ^5.14.2 peerDependencies: - "@types/react": ">= 16.8.0 < 19.0.0" - react: ">= 16.8.0 < 19.0.0" - react-dom: ">= 16.8.0 < 19.0.0" + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" search-insights: ">= 1 < 3" peerDependenciesMeta: "@types/react": @@ -1718,7 +3058,7 @@ __metadata: optional: true search-insights: optional: true - checksum: e3ad0a77932f99126933316b010a6bed30b9b3547a60269708482eea792856843c80df4b8476afb8a99e3b22a0bb37a6bd684992dccc3d277ad261a0bb27473a + checksum: af6c531af5f4c10fb57d4d29ae47fe297e4201c5130492e2c73c34306348bf87ab05b7eeae2cb83a6c33dbe8da3754b82275b86ae0116df65f34a9e51f9291bc languageName: node linkType: hard @@ -2295,6 +3635,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/gen-mapping@npm:^0.3.12": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + "@jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.5 resolution: "@jridgewell/gen-mapping@npm:0.3.5" @@ -2306,6 +3656,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 + languageName: node + linkType: hard + "@jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" @@ -2337,6 +3697,13 @@ __metadata: languageName: node linkType: hard +"@jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 + languageName: node + linkType: hard + "@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" @@ -2347,6 +3714,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.5 resolution: "@leichtgewicht/ip-codec@npm:2.0.5" @@ -2770,7 +4147,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint-scope@npm:^3.7.3": +"@types/eslint-scope@npm:^3.7.7": version: 3.7.7 resolution: "@types/eslint-scope@npm:3.7.7" dependencies: @@ -2799,13 +4176,20 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": +"@types/estree@npm:*, @types/estree@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree@npm:1.0.5" checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 752c0afee3ec82b8e24484bf6a27dfa093bbf3de4ef1c20ed0364fb6ad2c0c7971e7504ed9a7aaff103a47e2d945ce7a17f74951743dd944782a0735f53170de + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.19.5 resolution: "@types/express-serve-static-core@npm:4.19.5" @@ -3330,15 +4714,6 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 1c0c49b6a244503964ae46ae850baccf306e84caf99bc2010ed6103c69a423987b07b520a6c619f075d215388bd4923eccac995886a54309eda049ab78a4be95 - languageName: node - linkType: hard - "acorn-jsx@npm:^5.0.0": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -3357,7 +4732,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2": +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.8.2": version: 8.12.1 resolution: "acorn@npm:8.12.1" bin: @@ -3366,6 +4741,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.14.0": + version: 8.16.0 + resolution: "acorn@npm:8.16.0" + bin: + acorn: bin/acorn + checksum: bbfa466cd0dbd18b4460a85e9d0fc2f35db999380892403c573261beda91f23836db2aa71fd3ae65e94424ad14ff8e2b7bd37c7a2624278fd89137cd6e448c41 + languageName: node + linkType: hard + "address@npm:^1.0.1, address@npm:^1.1.2": version: 1.2.2 resolution: "address@npm:1.2.2" @@ -3426,7 +4810,19 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.2, ajv@npm:^6.12.5": +"ajv@npm:^6.12.2": + version: 6.15.0 + resolution: "ajv@npm:6.15.0" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: a8e0308f1b44c3dfd1143911353be51bf8aedc2f2bcd595061755ad241c8450a10e4b657af8ba764c5ec9ae2162010f21d5e0d43763e20d782a8171da99b967a + languageName: node + linkType: hard + +"ajv@npm:^6.12.5": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3451,36 +4847,58 @@ __metadata: linkType: hard "algoliasearch-helper@npm:^3.13.3": - version: 3.22.3 - resolution: "algoliasearch-helper@npm:3.22.3" + version: 3.29.1 + resolution: "algoliasearch-helper@npm:3.29.1" dependencies: "@algolia/events": ^4.0.1 peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: 18ee77496e6e3aec6b3c1cab7a6c3e103172e3ac39d8dac076f654a28f66e5a7a3f609f694451705e606510b93c9e2c10f1fe738761ff007044c445318ffdb90 - languageName: node - linkType: hard - -"algoliasearch@npm:^4.18.0, algoliasearch@npm:^4.19.1": - version: 4.24.0 - resolution: "algoliasearch@npm:4.24.0" - dependencies: - "@algolia/cache-browser-local-storage": 4.24.0 - "@algolia/cache-common": 4.24.0 - "@algolia/cache-in-memory": 4.24.0 - "@algolia/client-account": 4.24.0 - "@algolia/client-analytics": 4.24.0 - "@algolia/client-common": 4.24.0 - "@algolia/client-personalization": 4.24.0 - "@algolia/client-search": 4.24.0 - "@algolia/logger-common": 4.24.0 - "@algolia/logger-console": 4.24.0 - "@algolia/recommend": 4.24.0 - "@algolia/requester-browser-xhr": 4.24.0 - "@algolia/requester-common": 4.24.0 - "@algolia/requester-node-http": 4.24.0 - "@algolia/transporter": 4.24.0 - checksum: 13cae6ea7ff05e068906dcb101b940bcf1a4ea41008757554c16a7951cdaa3af3094e547e3e51f9e751f68906b5654506e1dd4a1debb1b9d54cbb227ca83e8db + checksum: ce51481bba2f5c1f7ec0c98f8fa811a257057896ac22bbbd19bacaf5d5b91c7d0698feb3ce6d166feb7d2332a41aa62a055f7482e3150d28f90299d1393a8030 + languageName: node + linkType: hard + +"algoliasearch@npm:^4.18.0": + version: 4.27.0 + resolution: "algoliasearch@npm:4.27.0" + dependencies: + "@algolia/cache-browser-local-storage": 4.27.0 + "@algolia/cache-common": 4.27.0 + "@algolia/cache-in-memory": 4.27.0 + "@algolia/client-account": 4.27.0 + "@algolia/client-analytics": 4.27.0 + "@algolia/client-common": 4.27.0 + "@algolia/client-personalization": 4.27.0 + "@algolia/client-search": 4.27.0 + "@algolia/logger-common": 4.27.0 + "@algolia/logger-console": 4.27.0 + "@algolia/recommend": 4.27.0 + "@algolia/requester-browser-xhr": 4.27.0 + "@algolia/requester-common": 4.27.0 + "@algolia/requester-node-http": 4.27.0 + "@algolia/transporter": 4.27.0 + checksum: ce222e3a1343d0ead630d7a4d3b04f01f60d06b56023591441d890a4a6b0e8ba9a08559831dff3e3e5030b60bdfbdec7db77ce34f8ecc53ee421e42d05a5fd34 + languageName: node + linkType: hard + +"algoliasearch@npm:^5.14.2": + version: 5.52.1 + resolution: "algoliasearch@npm:5.52.1" + dependencies: + "@algolia/abtesting": 1.18.1 + "@algolia/client-abtesting": 5.52.1 + "@algolia/client-analytics": 5.52.1 + "@algolia/client-common": 5.52.1 + "@algolia/client-insights": 5.52.1 + "@algolia/client-personalization": 5.52.1 + "@algolia/client-query-suggestions": 5.52.1 + "@algolia/client-search": 5.52.1 + "@algolia/ingestion": 1.52.1 + "@algolia/monitoring": 1.52.1 + "@algolia/recommend": 5.52.1 + "@algolia/requester-browser-xhr": 5.52.1 + "@algolia/requester-fetch": 5.52.1 + "@algolia/requester-node-http": 5.52.1 + checksum: 1412fc996c88aa948fa491eb6c128682ef27fa1edd2562452bf3d6615f0da5b0213bbae28bde76a3d78360647f6a8eb903a9a48f09739730b07c288b5f2e2761 languageName: node linkType: hard @@ -3604,7 +5022,24 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:^10.4.14, autoprefixer@npm:^10.4.19": +"autoprefixer@npm:^10.4.14": + version: 10.5.0 + resolution: "autoprefixer@npm:10.5.0" + dependencies: + browserslist: ^4.28.2 + caniuse-lite: ^1.0.30001787 + fraction.js: ^5.3.4 + picocolors: ^1.1.1 + postcss-value-parser: ^4.2.0 + peerDependencies: + postcss: ^8.1.0 + bin: + autoprefixer: bin/autoprefixer + checksum: e6475eb69ca7544a4abf5174b32e63b8d71aa5eb5618b7468b3c1a389b90596a6fdeab5c3fde7ebdb0b711047e307bd2a19c9f8011aa50ddb8b7eb91e71b7196 + languageName: node + linkType: hard + +"autoprefixer@npm:^10.4.19": version: 10.4.20 resolution: "autoprefixer@npm:10.4.20" dependencies: @@ -3623,15 +5058,15 @@ __metadata: linkType: hard "babel-loader@npm:^9.1.3": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" dependencies: find-cache-dir: ^4.0.0 schema-utils: ^4.0.0 peerDependencies: "@babel/core": ^7.12.0 webpack: ">=5" - checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28 + checksum: e1858d7625ad7cc8cabe6bbb8657f957041ffb1308375f359e92aa1654f413bfbb86a281bbf7cd4f7fff374d571c637b117551deac0231d779a198d4e4e78331 languageName: node linkType: hard @@ -3657,7 +5092,20 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.1, babel-plugin-polyfill-corejs3@npm:^0.10.4": +"babel-plugin-polyfill-corejs2@npm:^0.4.14, babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.17 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.17" + dependencies: + "@babel/compat-data": ^7.28.6 + "@babel/helper-define-polyfill-provider": ^0.6.8 + semver: ^6.3.1 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 945f80f413706831b665322690c655f3782ca6fd8c1fbcccaf449d976ebe6151677fb9331442c72e85eae9a05d5e6633be4e15f75d3e788762d825d31f2964ce + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.10.4": version: 0.10.6 resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" dependencies: @@ -3669,6 +5117,30 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.5 + core-js-compat: ^3.43.0 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: cf526031acd97ff2124e7c10e15047e6eeb0620d029c687f1dca99916a8fe6cac0e634b84c913db6cb68b7a024f82492ba8fdcc2a6266e7b05bdac2cba0c2434 + languageName: node + linkType: hard + +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.2 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.2" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.8 + core-js-compat: ^3.48.0 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 4bcaf4da658aaeb7a6534e6b65a6a45539c5f53bec596fefd0b44eebd249e5db8bbf239a421ceaff5933a0a7eee11e45791e4f4e04886cdf47bb1d4b1a8015aa + languageName: node + linkType: hard + "babel-plugin-polyfill-regenerator@npm:^0.6.1": version: 0.6.2 resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" @@ -3680,6 +5152,17 @@ __metadata: languageName: node linkType: hard +"babel-plugin-polyfill-regenerator@npm:^0.6.5, babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.8 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.8" + dependencies: + "@babel/helper-define-polyfill-provider": ^0.6.8 + peerDependencies: + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 974464353d6f974e97673385aff616a913c0b76039eab8c5317a2d07c661e080f3dcc213e86f3eae40010172a27ab793cda7a290a8a899716f9a22df9b1d92d2 + languageName: node + linkType: hard + "bail@npm:^2.0.0": version: 2.0.2 resolution: "bail@npm:2.0.2" @@ -3694,6 +5177,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.10.12": + version: 2.10.30 + resolution: "baseline-browser-mapping@npm:2.10.30" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 1ad8d9af3cebc4b91cf04b99c326fb0aab697ded642f3830deb96838c6dbb5d35ad2a2cad49064c6136b61bd962d77c23cd05db4f2e65f1fe1cfcca44ace9f4e + languageName: node + linkType: hard + "batch@npm:0.6.1": version: 0.6.1 resolution: "batch@npm:0.6.1" @@ -3812,7 +5304,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": version: 4.23.3 resolution: "browserslist@npm:4.23.3" dependencies: @@ -3826,6 +5318,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.18.1, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1, browserslist@npm:^4.28.2": + version: 4.28.2 + resolution: "browserslist@npm:4.28.2" + dependencies: + baseline-browser-mapping: ^2.10.12 + caniuse-lite: ^1.0.30001782 + electron-to-chromium: ^1.5.328 + node-releases: ^2.0.36 + update-browserslist-db: ^1.2.3 + bin: + browserslist: cli.js + checksum: 702cdd3462b5eb6f8a9bb3bf7bdc6d6a4141ced6935bb44edb7f3d40edd66198775f2b4a9178682535391293e04e625ba2b5943546d692f42ea080323cecb25e + languageName: node + linkType: hard + "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" @@ -3952,6 +5459,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001782, caniuse-lite@npm:^1.0.30001787": + version: 1.0.30001792 + resolution: "caniuse-lite@npm:1.0.30001792" + checksum: 25e2ba0feb792fbc99e98b236653dccec6387bf9351510b5401ffcb0c25193e47a2ba37e5ce44f92e0fb023670fe077b938ab8e1bad53bc03e95673e5bd5d439 + languageName: node + linkType: hard + "ccount@npm:^2.0.0": version: 2.0.1 resolution: "ccount@npm:2.0.1" @@ -4398,10 +5912,19 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.30.2": - version: 3.38.0 - resolution: "core-js-pure@npm:3.38.0" - checksum: 29aac7b56778370523f6a58f713c730975b097fea19838f93705730bd95d2da78b116e561e2cda637dde4cebe0a88baf9a5ce4e391732c39cbc5e55dc95bb38c +"core-js-compat@npm:^3.43.0, core-js-compat@npm:^3.48.0": + version: 3.49.0 + resolution: "core-js-compat@npm:3.49.0" + dependencies: + browserslist: ^4.28.1 + checksum: 21afa75a64b30810f4cc61e90758346e8df6bd20dd8da5afe08fc041b5fb766cf7c41c9cbc63f8fb96bef4e4a2a90eb6f2d7bbd20ac53b8ff23a58bc87e40231 + languageName: node + linkType: hard + +"core-js-pure@npm:^3.48.0": + version: 3.49.0 + resolution: "core-js-pure@npm:3.49.0" + checksum: 6d717ad23665135f0ba5fd18645d3ae6c0647752982037e61e571b7bea3910ad67a9482bbb558461a72015679dd25a40d114249e23c4267a69df494d3d4349ab languageName: node linkType: hard @@ -4715,6 +6238,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 + languageName: node + linkType: hard + "decode-named-character-reference@npm:^1.0.0": version: 1.0.2 resolution: "decode-named-character-reference@npm:1.0.2" @@ -4907,8 +6442,8 @@ __metadata: "@mdx-js/react": ^3.0.0 clsx: ^2.0.0 prism-react-renderer: ^2.3.0 - react: ^18.0.0 - react-dom: ^18.0.0 + react: ^19.0.0 + react-dom: ^19.0.0 languageName: unknown linkType: soft @@ -5030,6 +6565,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.328": + version: 1.5.358 + resolution: "electron-to-chromium@npm:1.5.358" + checksum: cab5eb95a6b7a7fac04018004ffe01072a51c079d3bf0d7f7fda4fb18f0972ba1e198d7822af9ec0072a19a85668dae01b4d787ab9b2a086e3ef47ff61c9468b + languageName: node + linkType: hard + "electron-to-chromium@npm:^1.5.4": version: 1.5.6 resolution: "electron-to-chromium@npm:1.5.6" @@ -5088,13 +6630,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.0": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"enhanced-resolve@npm:^5.17.1": + version: 5.21.3 + resolution: "enhanced-resolve@npm:5.21.3" dependencies: graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: 4bc38cf1cea96456f97503db7280394177d1bc46f8f87c267297d04f795ac5efa81e48115a2f5b6273c781027b5b6bfc5f62b54df629e4d25fa7001a86624f59 + tapable: ^2.3.3 + checksum: 54e48bde85d57937749765b8e32a17392be6b495a5e576f0c382b7340e095b8cbec224cae65fb8408f73fa68095d71e95fba5f10948072ef6fd26fa4dc5d6aeb languageName: node linkType: hard @@ -5165,6 +6707,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -5462,18 +7011,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 106143ff83705995225dcc559411288f3337e732bb2e264e79788f1914b6bd8f8bc3683102de60b15ba00e6ebb443633cabac77d4ebc5cb228c47cf955e199ff - languageName: node - linkType: hard - -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: ^1.3.2 - checksum: 5043d0c4a8d775ff58504d56c096563c11b113e4cb8a2668c6f824a1cd4fb3812e2fdf76537eb24a7ce4ae7def6bd9747da630c617cf2a4b6ce0c42514e4f21c + version: 3.1.2 + resolution: "fast-uri@npm:3.1.2" + checksum: 73a6e1b04e6fcf7a09ed93316e72d643ef177d26969973784690708612141f2c2f74657120bab75bf5bbc26bfd535a32c90a8c3bc50aca50584cf01f98815afe languageName: node linkType: hard @@ -5605,12 +7145,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.16.0 + resolution: "follow-redirects@npm:1.16.0" peerDependenciesMeta: debug: optional: true - checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 + checksum: e90dce4607b1f6b8b9883287f912585573c19088209ad82341d550a795b4ba514522b73b1b340cf618279df27975cd46504d09149be60291ba6767384c1fd8f8 languageName: node linkType: hard @@ -5683,6 +7223,13 @@ __metadata: languageName: node linkType: hard +"fraction.js@npm:^5.3.4": + version: 5.3.4 + resolution: "fraction.js@npm:5.3.4" + checksum: 6ac88ecfdb5fabe3566ae30f79828d448288efbb852cd43ad83afc961fb6923e1d77bc65fbcba8ccda10894114edd419581a050c73d61e368fdd4c3ff416a65a + languageName: node + linkType: hard + "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -6053,6 +7600,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.3": + version: 2.0.3 + resolution: "hasown@npm:2.0.3" + dependencies: + function-bind: ^1.1.2 + checksum: bb06756a13dc4e6d1f45993c86c23f12d167c6c30a7dcc907aec5042300b4eb255615a0e5ed2c65014b93bf8bfcff111d991032c5c01ddefb340aa64b329bd55 + languageName: node + linkType: hard + "hast-util-from-parse5@npm:^8.0.0": version: 8.0.1 resolution: "hast-util-from-parse5@npm:8.0.1" @@ -6290,8 +7846,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.5.3": - version: 5.6.0 - resolution: "html-webpack-plugin@npm:5.6.0" + version: 5.6.7 + resolution: "html-webpack-plugin@npm:5.6.7" dependencies: "@types/html-minifier-terser": ^6.0.0 html-minifier-terser: ^6.0.2 @@ -6306,7 +7862,7 @@ __metadata: optional: true webpack: optional: true - checksum: 32a6e41da538e798fd0be476637d7611a5e8a98a3508f031996e9eb27804dcdc282cb01f847cf5d066f21b49cfb8e21627fcf977ffd0c9bea81cf80e5a65070d + checksum: 043d17f0988fb173dd1a03159fc2e0c9a4d528f7f439b5318c72ec239e3c2be8267167c23a5a09f034c2c14ae0fccf8ab3055bee91151bb832744da2df29bfb6 languageName: node linkType: hard @@ -6481,13 +8037,13 @@ __metadata: linkType: hard "image-size@npm:^1.0.2": - version: 1.1.1 - resolution: "image-size@npm:1.1.1" + version: 1.2.1 + resolution: "image-size@npm:1.2.1" dependencies: queue: 6.0.2 bin: image-size: bin/image-size.js - checksum: 23b3a515dded89e7f967d52b885b430d6a5a903da954fce703130bfb6069d738d80e6588efd29acfaf5b6933424a56535aa7bf06867e4ebd0250c2ee51f19a4a + checksum: 8601ddd4edc1db16f097f5cf585c23214e29c3b8f4d8a8f8d59b8e3bae2338c8a5073236bfff421d8541091a98a38b802ed049203c745286a69d1aac4e5bc4c7 languageName: node linkType: hard @@ -6498,7 +8054,17 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.1.0, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.1.0": + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" + dependencies: + parent-module: ^1.0.0 + resolve-from: ^4.0.0 + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 + languageName: node + linkType: hard + +"import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -6681,6 +8247,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.1": + version: 2.16.2 + resolution: "is-core-module@npm:2.16.2" + dependencies: + hasown: ^2.0.3 + checksum: 9317844b4959f8fb268bfc1b4e24033d60058235c2e7273499c2abfd8e4510e7059b1339bd9109766293747daa3e0b5a89095fb2825a866a4093563fe8fdf16f + languageName: node + linkType: hard + "is-decimal@npm:^2.0.0": version: 2.0.1 resolution: "is-decimal@npm:2.0.1" @@ -7022,6 +8597,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -7232,7 +8816,7 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": +"loose-envify@npm:^1.0.0, loose-envify@npm:^1.2.0, loose-envify@npm:^1.3.1, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -8198,14 +9782,14 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.7.6": - version: 2.9.0 - resolution: "mini-css-extract-plugin@npm:2.9.0" + version: 2.10.2 + resolution: "mini-css-extract-plugin@npm:2.10.2" dependencies: schema-utils: ^4.0.0 tapable: ^2.2.1 peerDependencies: webpack: ^5.0.0 - checksum: ae192c67ba85ac8bffeab66774635bf90181f00d5dd6cf95412426192599ddf5506fb4b1550acbd7a5476476e39db53c770dd40f8378f7baf5de96e3fec4e6e9 + checksum: eb64d835d50fce8c181153b580f989661c37c0e56ddff7c1362051643180a31c8f8055d0d8dccc0dd2b022b1010d2957fe3097010f37acd33edfeb29bfc3734e languageName: node linkType: hard @@ -8216,7 +9800,16 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1": +"minimatch@npm:3.1.5, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5": + version: 3.1.5 + resolution: "minimatch@npm:3.1.5" + dependencies: + brace-expansion: ^1.1.7 + checksum: 47ef6f412c08be045a7291d11b1c40777925accf7252dc6d3caa39b1bfbb3a7ea390ba7aba464d762d783265c644143d2c8a204e6b5763145024d52ee65a1941 + languageName: node + linkType: hard + +"minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -8355,7 +9948,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -8374,6 +9967,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.11": + version: 3.3.12 + resolution: "nanoid@npm:3.3.12" + bin: + nanoid: bin/nanoid.cjs + checksum: 38699257447dc59e21e73e0510d0dfb16b7a610d9ca80633d5c3a68f9b4298c990513d30404ca8f163c2d03225ee01695ff8898bea6179183f38f0477b7635ac + languageName: node + linkType: hard + "nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -8453,6 +10055,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.36": + version: 2.0.44 + resolution: "node-releases@npm:2.0.44" + checksum: a96278a9ec8f3d67b796693047499fc64724f97cb7fb8aa50e8e5a9408f4f2c1e2eb8f3ee44c43bfd34b0331514d9a8ad5efc7a98e7b720a4b9cd9b4d0f0c2da + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -8866,10 +10475,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: b921a74e7576e25b06ad1635abf7e8125a29220d2efc2b71d74b9591f24a27e6f09078fa9a1b27516a097ea0637b7cab79d19b83d7f36a8ef3ef5422770e89d9 +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: bb249d08804f7961dd44fb175466c900b893c56e909db8e2a66ec12b9d9a964af269eb7a50892c933f52b47315953dfdb4279639fbce20977c3625a9ef3055fe languageName: node linkType: hard @@ -8907,6 +10516,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -9365,7 +10981,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.26, postcss@npm:^8.4.33, postcss@npm:^8.4.38": +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33": version: 8.4.41 resolution: "postcss@npm:8.4.41" dependencies: @@ -9376,6 +10992,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.26, postcss@npm:^8.4.38": + version: 8.5.14 + resolution: "postcss@npm:8.5.14" + dependencies: + nanoid: ^3.3.11 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: ec17d1519cd997b43aceb82bfa959f380085591269e286c53d5ba76eb1989525e7cde106a44f1565516fcbb50f206eb1858cc2cd5e5aaea3a8ee793886c8232c + languageName: node + linkType: hard + "pretty-error@npm:^4.0.0": version: 4.0.0 resolution: "pretty-error@npm:4.0.0" @@ -9481,13 +11108,6 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^1.3.2": - version: 1.4.1 - resolution: "punycode@npm:1.4.1" - checksum: fa6e698cb53db45e4628559e557ddaf554103d2a96a1d62892c8f4032cd3bc8871796cae9eabc1bc700e2b6677611521ce5bb1d9a27700086039965d0cf34518 - languageName: node - linkType: hard - "punycode@npm:^2.1.0": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -9617,22 +11237,21 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.0.0": - version: 18.3.1 - resolution: "react-dom@npm:18.3.1" +"react-dom@npm:^19.0.0": + version: 19.2.6 + resolution: "react-dom@npm:19.2.6" dependencies: - loose-envify: ^1.1.0 - scheduler: ^0.23.2 + scheduler: ^0.27.0 peerDependencies: - react: ^18.3.1 - checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 + react: ^19.2.6 + checksum: 9ecaff123867286a8fd18fb1028f0b493da4a48faacd38d97d4bde16c756d314869836ae74cd95733c5ebcff8e2cb568d0c06a1b18e2e7482eb898cc5b8dd92f languageName: node linkType: hard "react-error-overlay@npm:^6.0.11": - version: 6.0.11 - resolution: "react-error-overlay@npm:6.0.11" - checksum: ce7b44c38fadba9cedd7c095cf39192e632daeccf1d0747292ed524f17dcb056d16bc197ddee5723f9dd888f0b9b19c3b486c430319e30504289b9296f2d2c42 + version: 6.1.0 + resolution: "react-error-overlay@npm:6.1.0" + checksum: 4f0785ea14390e333d040e7d7d6f8b915ad9bd4b8ae6eb28e1a5338f23a0325798d20deea7572c3c129bd1d32c432b01e7a4d40ca99710e2fa1f8157929e6cda languageName: node linkType: hard @@ -9644,15 +11263,15 @@ __metadata: linkType: hard "react-helmet-async@npm:*": - version: 2.0.5 - resolution: "react-helmet-async@npm:2.0.5" + version: 3.0.0 + resolution: "react-helmet-async@npm:3.0.0" dependencies: invariant: ^2.2.4 react-fast-compare: ^3.2.2 shallowequal: ^1.1.0 peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 - checksum: cc2d13496f6fdee6b5f9472d3f7369db3e70e4fc1a55793708c2bbd90d48b0dedc725fd066f987c7a3d74b03a29bd5e65b9f40fa29bd8239e7cfb526aff4d4b6 + react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 78273903cbdbbf4ed555b38ec95e9080d7526e4194845f664c0374146fcdeb6ab4e02aee70b3b852b88272a3992c8c1dae2bf3fed188ccfa2d19b8e5e2432545 languageName: node linkType: hard @@ -9680,11 +11299,11 @@ __metadata: linkType: hard "react-json-view-lite@npm:^1.2.0": - version: 1.4.0 - resolution: "react-json-view-lite@npm:1.4.0" + version: 1.5.0 + resolution: "react-json-view-lite@npm:1.5.0" peerDependencies: react: ^16.13.1 || ^17.0.0 || ^18.0.0 - checksum: 420921258478da46a54887b6e4740e6cf21c7264eba95c33d6264fdf71c482f0746c1345eb187a4a52b31d2a3a951f88c7af338b9fccbced2a918751dd98c844 + checksum: e298621f6437ee06545bdb9e11265d92a60a6394ca8ea40bf12b50422a62f7a485998bf96d0b8b7cb95658d0122dbc900a814a572ddaaf59053657a27ccc7f33 languageName: node linkType: hard @@ -9759,12 +11378,10 @@ __metadata: languageName: node linkType: hard -"react@npm:^18.0.0": - version: 18.3.1 - resolution: "react@npm:18.3.1" - dependencies: - loose-envify: ^1.1.0 - checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 +"react@npm:^19.0.0": + version: 19.2.6 + resolution: "react@npm:19.2.6" + checksum: e250029064bff3f3308ee61e52c44bc9a0c938f6ef11a3f39c31db487ca173eb9b4b0cd3261e32613d3498df0da5586f3c582bc83cef54ad99bc5643772c4535 languageName: node linkType: hard @@ -9837,6 +11454,15 @@ __metadata: languageName: node linkType: hard +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" + dependencies: + regenerate: ^1.4.2 + checksum: 7ae4c1c32460c4360e3118c45eec0621424908f430fdd6f162c9172067786bf2b1682fbc885a33b26bc85e76e06f4d3f398b52425e801b0bb0cbae147dafb0b2 + languageName: node + linkType: hard + "regenerate@npm:^1.4.2": version: 1.4.2 resolution: "regenerate@npm:1.4.2" @@ -9874,6 +11500,20 @@ __metadata: languageName: node linkType: hard +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" + dependencies: + regenerate: ^1.4.2 + regenerate-unicode-properties: ^10.2.2 + regjsgen: ^0.8.0 + regjsparser: ^0.13.0 + unicode-match-property-ecmascript: ^2.0.0 + unicode-match-property-value-ecmascript: ^2.2.1 + checksum: a316eb988599b7fb9d77f4adb937c41c022504dc91ddd18175c11771addc7f1d9dce550f34e36038395e459a2cf9ffc0d663bfe8d3c6c186317ca000ba79a8cf + languageName: node + linkType: hard + "registry-auth-token@npm:^5.0.1": version: 5.0.2 resolution: "registry-auth-token@npm:5.0.2" @@ -9892,6 +11532,24 @@ __metadata: languageName: node linkType: hard +"regjsgen@npm:^0.8.0": + version: 0.8.0 + resolution: "regjsgen@npm:0.8.0" + checksum: a1d925ff14a4b2be774e45775ee6b33b256f89c42d480e6d85152d2133f18bd3d6af662161b226fa57466f7efec367eaf7ccd2a58c0ec2a1306667ba2ad07b0d + languageName: node + linkType: hard + +"regjsparser@npm:^0.13.0": + version: 0.13.1 + resolution: "regjsparser@npm:0.13.1" + dependencies: + jsesc: ~3.1.0 + bin: + regjsparser: bin/parser + checksum: 7a4e60e1487b6a0702e35540f882c0c6e0151f7f567c6a4c480c5397a3cab05f6d2bf5f64cdbcdf341e41caf232cae801a4db9b531c26eed3ca946b3c50ccb34 + languageName: node + linkType: hard + "regjsparser@npm:^0.9.1": version: 0.9.1 resolution: "regjsparser@npm:0.9.1" @@ -10073,7 +11731,21 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.14.2": +"resolve@npm:^1.1.6, resolve@npm:^1.22.11": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4dc5a614b32142ef9ab455b242ed33c472c4ea50df17dbe1e9dac5fe0eebd7d5fdb7cb9cc8ad2165e5e0f07694498a74e7fbd6cc1599e20d84682cce1b80a4dc + languageName: node + linkType: hard + +"resolve@npm:^1.14.2": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -10086,7 +11758,21 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.14.2#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.22.11#~builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#~builtin::version=1.22.12&hash=c3c19d" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 0cc5b060cbe081c85c331ac2eb08e8a54f0a195b899d5001822e5d3e2b335da651b1eed3d259fea904c22a0da9324a061e0e7ceab5dbeb5bcab5250b625754e1 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.14.2#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -10198,12 +11884,10 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.23.2": - version: 0.23.2 - resolution: "scheduler@npm:0.23.2" - dependencies: - loose-envify: ^1.1.0 - checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 +"scheduler@npm:^0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 92644ead0a9443e20f9d24132fe93675b156209b9eeb35ea245f8a86768d0cc0fcca56f341eeef21d9b6dd8e72d6d5e260eb5a41d34b05cd605dd45a29f572ef languageName: node linkType: hard @@ -10286,7 +11970,16 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": +"semver@npm:^7.3.2": + version: 7.8.0 + resolution: "semver@npm:7.8.0" + bin: + semver: bin/semver.js + checksum: 68e38bc26ed1191d7c78d2b711bdffc2f8b1d05a1caadda41a1d7e1a9d32e1da5ae5b645de5c5f2b27bde830d7e9c1cbeeafcb8fda091830411df7d40be405b1 + languageName: node + linkType: hard + +"semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -10326,18 +12019,17 @@ __metadata: linkType: hard "serve-handler@npm:^6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" + version: 6.1.7 + resolution: "serve-handler@npm:6.1.7" dependencies: bytes: 3.0.0 content-disposition: 0.5.2 - fast-url-parser: 1.1.3 mime-types: 2.1.18 - minimatch: 3.1.2 + minimatch: 3.1.5 path-is-inside: 1.0.2 - path-to-regexp: 2.2.1 + path-to-regexp: 3.3.0 range-parser: 1.2.0 - checksum: 7a98ca9cbf8692583b6cde4deb3941cff900fa38bf16adbfccccd8430209bab781e21d9a1f61c9c03e226f9f67689893bbce25941368f3ddaf985fc3858b49dc + checksum: eb03d807336f8186257a28cb48fd03b3ddb2dda918896fbe190e8f721354d276c3ff35506f20728aa89f6962f73fb721b3e1e4fe92847a4e758b95980d5c3daa languageName: node linkType: hard @@ -10428,7 +12120,14 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": +"shell-quote@npm:^1.7.3": + version: 1.8.3 + resolution: "shell-quote@npm:1.8.3" + checksum: 550dd84e677f8915eb013d43689c80bb114860649ec5298eb978f40b8f3d4bc4ccb072b82c094eb3548dc587144bb3965a8676f0d685c1cf4c40b5dc27166242 + languageName: node + linkType: hard + +"shell-quote@npm:^1.8.1": version: 1.8.1 resolution: "shell-quote@npm:1.8.1" checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b @@ -10592,6 +12291,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b + languageName: node + linkType: hard + "source-map-support@npm:~0.5.20": version: 0.5.21 resolution: "source-map-support@npm:0.5.21" @@ -10695,9 +12401,9 @@ __metadata: linkType: hard "std-env@npm:^3.0.1": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 4f489d13ff2ab838c9acd4ed6b786b51aa52ecacdfeaefe9275fcb220ff2ac80c6e95674723508fd29850a694569563a8caaaea738eb82ca16429b3a0b50e510 + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 51d641b36b0fae494a546fb8446d39a837957fbf902c765c62bd12af8e50682d141c4087ca032f1192fa90330c4f6ff23fd6c9795324efacd1684e814471e0e0 languageName: node linkType: hard @@ -10903,13 +12609,20 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 languageName: node linkType: hard +"tapable@npm:^2.3.3": + version: 2.3.3 + resolution: "tapable@npm:2.3.3" + checksum: 6f37a59e82a2daedd0fbfc231f6e6004389a9d4bcf8ab8f2d61f96f9f4fd4cbb087799627c5d644d75f518df2abbbc9b9ac699945e0c9a0c610f2a3ca92e0265 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -11110,6 +12823,13 @@ __metadata: languageName: node linkType: hard +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: e6c73e07bb4dc4aa399797a14b170e84a30ed290bcf97cc4305cf67dde8744119721ce17cef03f4f9d4ff48654bfa26eadc7fe1e8dd4b71b8f3b2e9a9742f013 + languageName: node + linkType: hard + "unicode-property-aliases-ecmascript@npm:^2.0.0": version: 2.1.0 resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" @@ -11254,6 +12974,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.2.3": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.1 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 6f209a97ae8eacdd3a1ef2eb365adf49d1e2a757e5b2dd4ac87dc8c99236cbe3e572d3e605a87dd7b538a11751b71d9f93edc47c7405262a293a493d155316cd + languageName: node + linkType: hard + "update-notifier@npm:^6.0.2": version: 6.0.2 resolution: "update-notifier@npm:6.0.2" @@ -11512,20 +13246,19 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5.88.1": - version: 5.93.0 - resolution: "webpack@npm:5.93.0" +"webpack@npm:5.96.1": + version: 5.96.1 + resolution: "webpack@npm:5.96.1" dependencies: - "@types/eslint-scope": ^3.7.3 - "@types/estree": ^1.0.5 + "@types/eslint-scope": ^3.7.7 + "@types/estree": ^1.0.6 "@webassemblyjs/ast": ^1.12.1 "@webassemblyjs/wasm-edit": ^1.12.1 "@webassemblyjs/wasm-parser": ^1.12.1 - acorn: ^8.7.1 - acorn-import-attributes: ^1.9.5 - browserslist: ^4.21.10 + acorn: ^8.14.0 + browserslist: ^4.24.0 chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.17.0 + enhanced-resolve: ^5.17.1 es-module-lexer: ^1.2.1 eslint-scope: 5.1.1 events: ^3.2.0 @@ -11545,7 +13278,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: c93bd73d9e1ab49b07e139582187f1c3760ee2cf0163b6288fab2ae210e39e59240a26284e7e5d29bec851255ef4b43c51642c882fa5a94e16ce7cb906deeb47 + checksum: ec3662f64895fae408440a997f87299e374c9d9f911f77b880bab46402f52221c7836bdf101fc2556338d07fc7cb86da50661f944eb1d1041a8361a5b9247876 languageName: node linkType: hard @@ -11734,9 +13467,9 @@ __metadata: linkType: hard "yaml@npm:^1.7.2": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: ce4ada136e8a78a0b08dc10b4b900936912d15de59905b2bf415b4d33c63df1d555d23acb2a41b23cf9fb5da41c256441afca3d6509de7247daa062fd2c5ea5f + version: 1.10.3 + resolution: "yaml@npm:1.10.3" + checksum: 6a2dd3582f4fbcc8d0e32dc26d1a42f72a901eb6ae8fad616bd720514b11a53a64eabc21dba97fbcd951c7c0e1963502313789d93a753e7786e7452376498be5 languageName: node linkType: hard diff --git a/packages/e2e-react/.gitignore b/packages/e2e-react/.gitignore index b88c8135ab..f79792577c 100644 --- a/packages/e2e-react/.gitignore +++ b/packages/e2e-react/.gitignore @@ -26,3 +26,4 @@ dist-ssr /playwright-report/ /blob-report/ /playwright/.cache/ +/tests/.auth/ diff --git a/packages/e2e-react/package.json b/packages/e2e-react/package.json index 1e34c0276c..d9d96ffb4c 100644 --- a/packages/e2e-react/package.json +++ b/packages/e2e-react/package.json @@ -14,14 +14,14 @@ }, "dependencies": { "@embeddedchat/react": "workspace:*", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { "@playwright/test": "^1.41.2", "@types/node": "^20.11.19", - "@types/react": "^18.2.55", - "@types/react-dom": "^18.2.19", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react": "^4.2.1", diff --git a/packages/e2e-react/playwright.config.ts b/packages/e2e-react/playwright.config.ts index a91deee96a..9bbe41df51 100644 --- a/packages/e2e-react/playwright.config.ts +++ b/packages/e2e-react/playwright.config.ts @@ -73,5 +73,8 @@ export default defineConfig({ command: 'yarn dev', url: 'http://127.0.0.1:5173', reuseExistingServer: !process.env.CI, + timeout: 120000, + stdout: 'pipe', + stderr: 'pipe', }, }); diff --git a/packages/e2e-react/vite.config.ts b/packages/e2e-react/vite.config.ts index 028287cd5a..d89dc27b4a 100644 --- a/packages/e2e-react/vite.config.ts +++ b/packages/e2e-react/vite.config.ts @@ -6,5 +6,8 @@ export default defineConfig({ plugins: [react()], define: { 'process.env': {} - } + }, + server: { + host: '127.0.0.1', + }, }) diff --git a/packages/htmlembed/package.json b/packages/htmlembed/package.json index 82beecd43a..9d433d5554 100644 --- a/packages/htmlembed/package.json +++ b/packages/htmlembed/package.json @@ -14,8 +14,8 @@ }, "dependencies": { "@embeddedchat/react": "workspace:^", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "^19.0.0", + "react-dom": "^19.0.0" }, "devDependencies": { "@vitejs/plugin-react": "^3.1.0", diff --git a/packages/layout_editor/package.json b/packages/layout_editor/package.json index e8e9827e39..5cc6d09171 100644 --- a/packages/layout_editor/package.json +++ b/packages/layout_editor/package.json @@ -14,9 +14,9 @@ "@dnd-kit/sortable": "^8.0.0", "@embeddedchat/markups": "workspace:^", "@embeddedchat/ui-elements": "workspace:^", - "react": "^18.2.0", + "react": "^19.0.0", "react-color": "^2.19.3", - "react-dom": "^18.2.0", + "react-dom": "^19.0.0", "react-resizable-panels": "^2.0.20", "react-syntax-highlighter": "^15.5.0" }, diff --git a/packages/layout_editor/src/components/SurfaceMenu/SurfaceItem.jsx b/packages/layout_editor/src/components/SurfaceMenu/SurfaceItem.jsx index 4a4f47f231..caeb77ec37 100644 --- a/packages/layout_editor/src/components/SurfaceMenu/SurfaceItem.jsx +++ b/packages/layout_editor/src/components/SurfaceMenu/SurfaceItem.jsx @@ -18,7 +18,7 @@ const SurfaceItem = ({ onRemove, type, cursor = 'grab', - tooltipPosition = 'bottom', + tooltipPosition = 'top', size, }) => { const { attributes, listeners, setNodeRef, transform, isDragging } = diff --git a/packages/layout_editor/src/store/chatInputItemsStore.js b/packages/layout_editor/src/store/chatInputItemsStore.js index 1a4b948bfa..7d140d26f0 100644 --- a/packages/layout_editor/src/store/chatInputItemsStore.js +++ b/packages/layout_editor/src/store/chatInputItemsStore.js @@ -1,7 +1,7 @@ import { create } from 'zustand'; const useChatInputItemsStore = create((set) => ({ - surfaceItems: ['emoji', 'formatter', 'audio', 'video', 'file'], + surfaceItems: ['emoji', 'formatter', 'link', 'audio', 'video', 'file'], formatters: ['bold', 'italic', 'strike', 'code', 'multiline'], setSurfaceItems: (items) => set({ surfaceItems: items }), setFormatters: (items) => set({ formatters: items }), diff --git a/packages/layout_editor/src/views/ChatInput/ChatInputToolbar.jsx b/packages/layout_editor/src/views/ChatInput/ChatInputToolbar.jsx index f594e3a813..9d5550c718 100644 --- a/packages/layout_editor/src/views/ChatInput/ChatInputToolbar.jsx +++ b/packages/layout_editor/src/views/ChatInput/ChatInputToolbar.jsx @@ -41,6 +41,13 @@ const ChatInputToolbar = () => { iconName: 'emoji', visible: true, }, + link: { + label: 'Link', + id: 'link', + onClick: () => {}, + iconName: 'link', + visible: true, + }, audio: { label: 'Audio Message', id: 'audio', @@ -61,7 +68,7 @@ const ChatInputToolbar = () => { onClick: () => {}, iconName: 'attachment', visible: true, - }, + }, formatter: { label: 'Formatter', id: 'formatter', diff --git a/packages/layout_editor/src/views/ThemeLab/LayoutSetting.jsx b/packages/layout_editor/src/views/ThemeLab/LayoutSetting.jsx index 0eba8d6eab..60ac4c4296 100644 --- a/packages/layout_editor/src/views/ThemeLab/LayoutSetting.jsx +++ b/packages/layout_editor/src/views/ThemeLab/LayoutSetting.jsx @@ -217,6 +217,15 @@ const LayoutSetting = () => { iconName: 'emoji', visible: true, }, + link: { + label: 'Link', + id: 'link', + onClick: () => { + addInputSurfaceItem('link'); + }, + iconName: 'link', + visible: true, + }, audio: { label: 'Audio Message', id: 'audio', @@ -243,7 +252,7 @@ const LayoutSetting = () => { }, iconName: 'attachment', visible: true, - }, + }, formatter: { label: 'Formatter', id: 'formatter', diff --git a/packages/layout_editor/vite.config.ts b/packages/layout_editor/vite.config.ts index 2b9daff2d3..b6ab8acd24 100644 --- a/packages/layout_editor/vite.config.ts +++ b/packages/layout_editor/vite.config.ts @@ -11,5 +11,5 @@ export default defineConfig({ }, }), ], - base: "/EmbeddedChat/layout_editor" + base: process.env.LAYOUT_EDITOR_BASE_URL || '/EmbeddedChat/layout_editor', }); diff --git a/packages/markups/package.json b/packages/markups/package.json index 5557b50c04..25b6b57032 100644 --- a/packages/markups/package.json +++ b/packages/markups/package.json @@ -53,8 +53,8 @@ "lint-staged": "^12.4.2", "npm-run-all": "^4.1.5", "prettier": "^2.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^5.0.1", "rollup": "^2.70.1", "rollup-plugin-analyzer": "^4.0.0", @@ -67,8 +67,8 @@ "typescript": "^5.5.3" }, "peerDependencies": { - "react": ">=17.0.2 <19.0.0", - "react-dom": ">=17.0.2 <19.0.0" + "react": ">=19.0.0 <20.0.0", + "react-dom": ">=19.0.0 <20.0.0" }, "dependencies": { "@embeddedchat/ui-elements": "workspace:^", @@ -76,6 +76,7 @@ "@emotion/react": "11.7.1", "@rollup/plugin-json": "^6.0.0", "emoji-toolkit": "^7.0.1", - "prop-types": "^15.8.1" + "prop-types": "^15.8.1", + "react-syntax-highlighter": "^15.6.1" } } diff --git a/packages/markups/src/elements/CodeBlock.js b/packages/markups/src/elements/CodeBlock.js index b8f5acf133..0aeb71d398 100644 --- a/packages/markups/src/elements/CodeBlock.js +++ b/packages/markups/src/elements/CodeBlock.js @@ -1,9 +1,13 @@ import React, { useMemo } from 'react'; import PropTypes from 'prop-types'; -import { Box } from '@embeddedchat/ui-elements'; -import { CodeBlockStyles as styles } from './elements.styles'; +import { Box, useTheme } from '@embeddedchat/ui-elements'; +import SyntaxHighlighter from 'react-syntax-highlighter'; +import { vs, monokai } from 'react-syntax-highlighter/dist/esm/styles/hljs'; +import { CodeBlockStyles } from './elements.styles'; const CodeBlock = ({ lines }) => { + const { mode } = useTheme(); + const styles = CodeBlockStyles(); const code = useMemo( () => lines.map((line) => line.value.value).join('\n'), [lines] @@ -14,7 +18,16 @@ const CodeBlock = ({ lines }) => { ``` - {code} + + {code} + ``` @@ -23,7 +36,6 @@ const CodeBlock = ({ lines }) => { }; export default CodeBlock; - CodeBlock.propTypes = { lines: PropTypes.any, }; diff --git a/packages/markups/src/elements/CodeElement.js b/packages/markups/src/elements/CodeElement.js index 043f5a2a00..8a2483f17f 100644 --- a/packages/markups/src/elements/CodeElement.js +++ b/packages/markups/src/elements/CodeElement.js @@ -1,12 +1,16 @@ import React from 'react'; import PropTypes from 'prop-types'; import PlainSpan from './PlainSpan'; +import { InlineElementsStyles } from './elements.styles'; -const CodeElement = ({ contents }) => ( - - - -); +const CodeElement = ({ contents }) => { + const styles = InlineElementsStyles(); + return ( + + + + ); +}; export default CodeElement; diff --git a/packages/markups/src/elements/InlineElements.js b/packages/markups/src/elements/InlineElements.js index 0ab5a7fb1e..2584196e89 100644 --- a/packages/markups/src/elements/InlineElements.js +++ b/packages/markups/src/elements/InlineElements.js @@ -10,6 +10,7 @@ import ChannelMention from '../mentions/ChannelMention'; import ColorElement from './ColorElement'; import LinkSpan from './LinkSpan'; import UserMention from '../mentions/UserMention'; +import TimestampElement from './TimestampElement'; const InlineElements = ({ contents }) => contents.map((content, index) => { @@ -53,6 +54,10 @@ const InlineElements = ({ contents }) => } /> ); + + case 'TIMESTAMP': + return ; + default: return null; } diff --git a/packages/markups/src/elements/LinkSpan.js b/packages/markups/src/elements/LinkSpan.js index b1257f98de..319d180130 100644 --- a/packages/markups/src/elements/LinkSpan.js +++ b/packages/markups/src/elements/LinkSpan.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { useTheme } from '@embeddedchat/ui-elements'; import PlainSpan from './PlainSpan'; import StrikeSpan from './StrikeSpan'; import ItalicSpan from './ItalicSpan'; @@ -27,6 +28,9 @@ const getBaseURI = () => { const isExternal = (href) => href.indexOf(getBaseURI()) !== 0; const LinkSpan = ({ href, label }) => { + const { theme } = useTheme(); + const { mode } = useTheme(); + const contents = React.useMemo(() => { const labelArray = Array.isArray(label) ? label : [label]; @@ -54,13 +58,31 @@ const LinkSpan = ({ href, label }) => { if (isExternal(href)) { return ( - + {contents} ); } return ( - + {contents} ); diff --git a/packages/markups/src/elements/TimestampElement.js b/packages/markups/src/elements/TimestampElement.js new file mode 100644 index 0000000000..fd860046d7 --- /dev/null +++ b/packages/markups/src/elements/TimestampElement.js @@ -0,0 +1,118 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import CodeElement from './CodeElement'; + +function timeAgo(dateParam, locale) { + const int = new Intl.RelativeTimeFormat(locale, { style: 'long' }); + + const date = new Date(dateParam).getTime(); + const today = new Date().getTime(); + const seconds = Math.round((date - today) / 1000); + const minutes = Math.round(seconds / 60); + const hours = Math.round(minutes / 60); + const days = Math.round(hours / 24); + const weeks = Math.round(days / 7); + const months = new Date(date).getMonth() - new Date().getMonth(); + const years = new Date(date).getFullYear() - new Date().getFullYear(); + + if (Math.abs(seconds) < 60) { + return int.format(seconds, 'seconds'); + } + if (Math.abs(minutes) < 60) { + return int.format(minutes, 'minutes'); + } + if (Math.abs(hours) < 24) { + return int.format(hours, 'hours'); + } + if (Math.abs(days) < 7) { + return int.format(days, 'days'); + } + if (Math.abs(weeks) < 4) { + return int.format(weeks, 'weeks'); + } + if (Math.abs(months) < 12) { + return int.format(months, 'months'); + } + return int.format(years, 'years'); +} + +const formatTimestamp = (timestamp, format) => { + const date = new Date(timestamp * 1000); + + const getOrdinalDate = (day) => { + const suffix = ['th', 'st', 'nd', 'rd']; + const val = day % 100; + return day + (suffix[(val - 20) % 10] || suffix[val] || suffix[0]); + }; + + const timeZoneOffset = date.getTimezoneOffset(); + const sign = timeZoneOffset > 0 ? '-' : '+'; + const hours = Math.floor(Math.abs(timeZoneOffset) / 60); + const minutes = Math.abs(timeZoneOffset) % 60; + const timeZone = `GMT${sign}${String(hours).padStart(2, '0')}:${String( + minutes + ).padStart(2, '0')}`; + + const month = date.toLocaleString('en-US', { month: 'long' }); + const day = getOrdinalDate(date.getDate()); + const year = date.getFullYear(); + const time = date.toLocaleString([], { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); + + const shortDate = date.toLocaleDateString('en-US'); + const shortTime = date.toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + }); + + switch (format) { + case 't': { + return shortTime; + } + case 'T': { + return time; + } + case 'd': { + return shortDate; + } + case 'D': { + return `${shortDate}, ${shortTime}`; + } + case 'f': { + return `${month} ${day}, ${year} at ${time} ${timeZone}`; + } + case 'F': { + const weekday = date.toLocaleString('en-US', { weekday: 'long' }); + return `${weekday}, ${month} ${day} ${year} at ${time} ${timeZone}`; + } + case 'R': { + return timeAgo(timestamp * 1000, 'en'); + } + default: { + return date.toLocaleString(); + } + } +}; + +const TimestampElement = ({ contents }) => { + if (typeof contents === 'object' && contents.timestamp && contents.format) { + const { timestamp, format } = contents; + + const formattedTimestamp = formatTimestamp(parseInt(timestamp, 10), format); + return ; + } + + return null; +}; + +export default TimestampElement; + +TimestampElement.propTypes = { + contents: PropTypes.shape({ + timestamp: PropTypes.string.isRequired, + format: PropTypes.string.isRequired, + }).isRequired, +}; diff --git a/packages/markups/src/elements/elements.styles.js b/packages/markups/src/elements/elements.styles.js index aa44d77dd1..31497a6517 100644 --- a/packages/markups/src/elements/elements.styles.js +++ b/packages/markups/src/elements/elements.styles.js @@ -1,23 +1,46 @@ import { css } from '@emotion/react'; -import { useTheme } from '@embeddedchat/ui-elements'; +import { useTheme, darken } from '@embeddedchat/ui-elements'; -export const CodeBlockStyles = { - copyonly: css` - display: none; - width: 100%; - height: 0; - user-select: none; - vertical-align: baseline; - font-size: 0; - -moz-box-orient: vertical; - `, +export const InlineElementsStyles = () => { + const { theme } = useTheme(); + const styles = { + inlineElement: css` + font-weight: 600; + font-size: 0.75rem; + width: fit-content; + padding: 3px; + background-color: ${theme.colors.border}; + border-radius: 6px; + `, + }; + return styles; +}; +export const CodeBlockStyles = () => { + const { theme } = useTheme(); + const styles = { + copyonly: css` + display: none; + width: 100%; + height: 0; + user-select: none; + vertical-align: baseline; + font-size: 0; + -moz-box-orient: vertical; + `, - prestyle: css` - display: inline-block; - max-width: 100%; - overflow-x: auto; - white-space: pre-wrap; - `, + prestyle: css` + display: inline-block; + width: 100%; + overflow-x: auto; + white-space: pre-wrap; + `, + codeBlock: css` + background-color: ${darken(theme.colors.accent, 0.01)} !important; + border-radius: ${theme.radius}; + font-weight: 600; + `, + }; + return styles; }; export const ColorElementStyles = { @@ -76,6 +99,13 @@ const useMentionStyles = (contents, username) => { cursor: pointer; padding: 1.5px; border-radius: 3px; + + &:hover { + text-decoration: underline; + text-decoration-color: ${contents.value === username + ? theme.colors.destructiveForeground + : theme.colors.mutedForeground}; + } `, }; diff --git a/packages/markups/src/mentions/UserMention.js b/packages/markups/src/mentions/UserMention.js index 679ffc0d37..45615e4a1a 100644 --- a/packages/markups/src/mentions/UserMention.js +++ b/packages/markups/src/mentions/UserMention.js @@ -1,14 +1,35 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; -import { Box } from '@embeddedchat/ui-elements'; +import { Box, Tooltip } from '@embeddedchat/ui-elements'; +import { useUserStore } from '@embeddedchat/react/src/store'; +import useSetExclusiveState from '@embeddedchat/react/src/hooks/useSetExclusiveState'; +import RCContext from '@embeddedchat/react/src/context/RCInstance'; import { MarkupInteractionContext } from '../MarkupInteractionContext'; import useMentionStyles from '../elements/elements.styles'; const UserMention = ({ contents }) => { const { members, username } = useContext(MarkupInteractionContext); + const { RCInstance } = useContext(RCContext); + const setExclusiveState = useSetExclusiveState(); + const { setShowCurrentUserInfo, setCurrentUser } = useUserStore((state) => ({ + setShowCurrentUserInfo: state.setShowCurrentUserInfo, + setCurrentUser: state.setCurrentUser, + })); + + const handleUserInfo = async (uname) => { + const data = await RCInstance.userData(uname); + setCurrentUser({ + _id: data.user._id, + username: data.user.username, + name: data.user.name, + }); + setExclusiveState(setShowCurrentUserInfo); + }; const hasMember = (user) => { - if (user === 'all' || user === 'here') return true; + if (user === 'all' || user === 'here') { + return true; + } let found = false; Object.keys(members).forEach((ele) => { if (members[ele].username === user) { @@ -20,12 +41,27 @@ const UserMention = ({ contents }) => { const styles = useMentionStyles(contents, username); + const handleClick = () => { + if (!['here', 'all'].includes(contents.value)) { + handleUserInfo(contents.value); + } + }; + + const tooltipMap = { + all: 'Mentions all the room members', + here: 'Mentions online room members', + [username]: 'Mentions you', + }; + const tooltipText = tooltipMap[contents.value] || 'Mentions user'; + return ( <> {hasMember(contents.value) ? ( - - {contents.value} - + + + {contents.value} + + ) : ( `@${contents.value}` )} diff --git a/packages/react/.storybook/main.js b/packages/react/.storybook/main.js index 7c981da605..0db593a3da 100644 --- a/packages/react/.storybook/main.js +++ b/packages/react/.storybook/main.js @@ -5,15 +5,7 @@ const config = { '@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-interactions', - { - name: '@storybook/addon-styling', - options: { - sass: { - // Require your Sass preprocessor here - implementation: require('sass'), - }, - }, - }, + '@storybook/addon-webpack5-compiler-babel', ], framework: { name: '@storybook/react-webpack5', diff --git a/packages/react/.storybook/preview.js b/packages/react/.storybook/preview.js index 82acdc77cb..8b76fa085f 100644 --- a/packages/react/.storybook/preview.js +++ b/packages/react/.storybook/preview.js @@ -1,9 +1,48 @@ import 'normalize.css'; +// ─── React 19 logComponentRender patch ─────────────────────────────────────── +// React 19's dev-mode calls performance.measure() with a `detail` option that +// contains component prop diffs. The browser internally structured-clones that +// detail, and crashes with: +// "DOMException: unsupported type for structured data" +// when the EmbeddedChatApi context value (which holds WebSocket/Promises) is +// diffed as a prop on the Context.Provider component. +// +// We can't configure this away — it's baked into react-dom-client.development.js. +// The patch below wraps performance.measure so the DOMException is caught and +// the call is retried without the non-serializable detail, keeping the browser's +// performance timeline intact for everything else. +if (typeof performance !== 'undefined' && typeof performance.measure === 'function') { + const _originalMeasure = performance.measure.bind(performance); + performance.measure = function patchedMeasure(name, startOrOptions, endMark) { + try { + if (typeof startOrOptions === 'object' && startOrOptions !== null) { + return _originalMeasure(name, startOrOptions, endMark); + } + return _originalMeasure(name, startOrOptions, endMark); + } catch (e) { + if (e instanceof DOMException) { + // Retry without the detail so the mark still appears in DevTools + try { + const safe = { ...startOrOptions }; + delete safe.detail; + return _originalMeasure(name, safe); + } catch (_) { /* ignore */ } + } else { + throw e; + } + } + }; +} + /** @type { import('@storybook/react').Preview } */ const preview = { parameters: { - actions: { argTypesRegex: '^on[A-Z].*' }, + // IMPORTANT: Do NOT re-enable argTypesRegex here. + // Storybook's action addon auto-wraps any on* prop matching the regex and + // tries to structured-clone every argument via postMessage. File/Blob objects + // are not cloneable and would cause the same DOMException. + actions: { disable: true }, controls: { matchers: { color: /(background|color)$/i, @@ -14,3 +53,4 @@ const preview = { }; export default preview; + diff --git a/packages/react/docker-compose.yml b/packages/react/docker-compose.yml index 99ea1bf654..e94da4e998 100644 --- a/packages/react/docker-compose.yml +++ b/packages/react/docker-compose.yml @@ -18,7 +18,7 @@ services: - "0.0.0.0:3000:3000" mongodb: - image: docker.io/bitnami/mongodb:4.4 + image: docker.io/bitnami/mongodb:latest restart: on-failure volumes: - mongodb_data:/bitnami/mongodb diff --git a/packages/react/package.json b/packages/react/package.json index 82cc802682..49e21b50ad 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -13,8 +13,8 @@ ], "scripts": { "prebuild": "rimraf dist", - "build": "rollup -c --context=window --environment NODE_ENV:production", - "watch": "rollup -c --watch --context=window", + "build": "cross-env NODE_OPTIONS=--max-old-space-size=4096 rollup -c --context=window --environment NODE_ENV:production", + "watch": "cross-env NODE_OPTIONS=--max-old-space-size=4096 rollup -c --watch --context=window", "test:lint": "eslint src/**/*.js", "format": "prettier --write 'src/' ", "format:check": "prettier --check 'src/' ", @@ -37,14 +37,14 @@ "@rollup/plugin-commonjs": "^21.0.2", "@rollup/plugin-node-resolve": "^13.1.3", "@rollup/plugin-replace": "^5.0.2", - "@storybook/addon-essentials": "^7.0.26", - "@storybook/addon-interactions": "^7.0.26", - "@storybook/addon-links": "^7.0.26", - "@storybook/addon-styling": "^1.3.6", - "@storybook/blocks": "^7.0.26", - "@storybook/react": "^7.0.26", - "@storybook/react-webpack5": "^7.0.26", - "@storybook/testing-library": "^0.2.0", + "@storybook/addon-essentials": "^8.6.18", + "@storybook/addon-interactions": "^8.6.18", + "@storybook/addon-links": "^8.6.18", + "@storybook/addon-webpack5-compiler-babel": "~3.0.0", + "@storybook/blocks": "^8.6.18", + "@storybook/react": "^8.6.18", + "@storybook/react-webpack5": "^8.6.18", + "@storybook/test": "^8.6.18", "@testing-library/react": "^12.1.4", "babel-jest": "^27.5.1", "concurrently": "^7.2.0", @@ -65,8 +65,8 @@ "lint-staged": "^12.4.2", "npm-run-all": "^4.1.5", "prettier": "^2.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^5.0.1", "rollup": "^2.70.1", "rollup-plugin-analyzer": "^4.0.0", @@ -75,12 +75,11 @@ "rollup-plugin-postcss": "^4.0.2", "rollup-plugin-terser": "^7.0.2", "sass": "^1.66.1", - "schedule": "^0.4.0", - "storybook": "^7.0.26" + "storybook": "^8.6.18" }, "peerDependencies": { - "react": ">=17.0.2 <19.0.0", - "react-dom": ">=17.0.2 <19.0.0" + "react": ">=19.0.0 <20.0.0", + "react-dom": ">=19.0.0 <20.0.0" }, "dependencies": { "@embeddedchat/api": "workspace:^", diff --git a/packages/react/src/hooks/useDropBox.js b/packages/react/src/hooks/useDropBox.js index 27002ce7c4..a78b395092 100644 --- a/packages/react/src/hooks/useDropBox.js +++ b/packages/react/src/hooks/useDropBox.js @@ -15,10 +15,16 @@ const useDropBox = () => { setData(e.dataTransfer.files[0]); }; + const handlePaste = (file) => { + toggle(); + setData(file); + }; + return { data, handleDrag, handleDragDrop, + handlePaste, }; }; diff --git a/packages/react/src/hooks/useFetchChatData.js b/packages/react/src/hooks/useFetchChatData.js index 1d08f0eaf4..57a564a186 100644 --- a/packages/react/src/hooks/useFetchChatData.js +++ b/packages/react/src/hooks/useFetchChatData.js @@ -1,21 +1,123 @@ -import { useCallback, useContext } from 'react'; +import { useCallback, useContext, useRef, useMemo } from 'react'; import RCContext from '../context/RCInstance'; import { useUserStore, useChannelStore, useMemberStore, useMessageStore, + useStarredMessageStore, + usePinnedMessageStore, } from '../store'; const useFetchChatData = (showRoles) => { - const { RCInstance, ECOptions } = useContext(RCContext); - const setMemberRoles = useMemberStore((state) => state.setMemberRoles); - const isChannelPrivate = useChannelStore((state) => state.isChannelPrivate); + const { RCInstance } = useContext(RCContext); const setMessages = useMessageStore((state) => state.setMessages); + const setMessagesOffset = useMessageStore((state) => state.setMessagesOffset); const setAdmins = useMemberStore((state) => state.setAdmins); + const setMemberRoles = useMemberStore((state) => state.setMemberRoles); + const permissionsRef = useRef(null); + const setStarredMessages = useStarredMessageStore( + (state) => state.setStarredMessages + ); + const setPinnedMessages = usePinnedMessageStore( + (state) => state.setPinnedMessages + ); const isUserAuthenticated = useUserStore( (state) => state.isUserAuthenticated ); + const setViewUserInfoPermissions = useUserStore( + (state) => state.setViewUserInfoPermissions + ); + const setDeleteMessageRoles = useMessageStore( + (state) => state.setDeleteMessageRoles + ); + const setDeleteOwnMessageRoles = useMessageStore( + (state) => state.setDeleteOwnMessageRoles + ); + const setForceDeleteMessageRoles = useMessageStore( + (state) => state.setForceDeleteMessageRoles + ); + const setUserPinPermissions = useUserStore( + (state) => state.setUserPinPermissions + ); + const setEditMessagePermissions = useMessageStore( + (state) => state.setEditMessagePermissions + ); + + const setters = useMemo( + () => + new Map([ + ['viewUserInfo', setViewUserInfoPermissions], + ['deleteMessage', setDeleteMessageRoles], + ['deleteOwnMessage', setDeleteOwnMessageRoles], + ['forceDeleteMessage', setForceDeleteMessageRoles], + ['userPin', setUserPinPermissions], + ['editMessage', setEditMessagePermissions], + ]), + [ + setViewUserInfoPermissions, + setDeleteMessageRoles, + setDeleteOwnMessageRoles, + setForceDeleteMessageRoles, + setUserPinPermissions, + setEditMessagePermissions, + ] + ); + + const permissionKeys = useMemo( + () => + new Map([ + ['viewUserInfo', 'view-full-other-user-info'], + ['deleteMessage', 'delete-message'], + ['deleteOwnMessage', 'delete-own-message'], + ['forceDeleteMessage', 'force-delete-message'], + ['userPin', 'pin-message'], + ['editMessage', 'edit-message'], + ]), + [] + ); + + const applyPermissions = useCallback( + (permissionsMap) => { + Array.from(permissionKeys).forEach(([key, permissionId]) => { + const setter = setters.get(key); + if (setter) { + setter(permissionsMap.get(permissionId)); + } + }); + }, + [permissionKeys, setters] + ); + + const createPermissionsMap = useCallback( + (permissions) => + new Map(permissions.update.map((item) => [item._id, item])), + [] + ); + const fetchAndSetPermissions = useCallback(async () => { + try { + const permissions = await RCInstance.permissionInfo(); + + if ( + !permissionsRef.current || + JSON.stringify(permissions) !== + JSON.stringify(permissionsRef.current.raw) + ) { + const permissionsMap = createPermissionsMap(permissions); + + permissionsRef.current = { + map: permissionsMap, + }; + + applyPermissions(permissionsMap); + } + + return permissionsRef.current.map; + } catch (error) { + console.error('Error fetching permissions:', error); + return null; + } + }, [RCInstance, applyPermissions, createPermissionsMap]); const getMessagesAndRoles = useCallback( async (anonymousMode) => { @@ -24,22 +126,31 @@ const useFetchChatData = (showRoles) => { return; } - const { messages } = await RCInstance.getMessages( + let channelIsPrivate = false; + if (!anonymousMode) { + const { channelInfo, setChannelInfo, setIsChannelPrivate } = + useChannelStore.getState(); + if (channelInfo?._id) { + channelIsPrivate = channelInfo.t === 'p'; + } else { + const res = await RCInstance.channelInfo(); + if (res?.success) { + setChannelInfo(res.room); + channelIsPrivate = res.room.t === 'p'; + if (channelIsPrivate) setIsChannelPrivate(true); + } + } + } + + const { messages, count } = await RCInstance.getMessages( anonymousMode, - ECOptions?.enableThreads - ? { - query: { - tmid: { - $exists: false, - }, - }, - } - : undefined, - anonymousMode ? false : isChannelPrivate + undefined, + channelIsPrivate ); if (messages) { setMessages(messages.filter((message) => message._hidden !== true)); + setMessagesOffset(count); } if (!isUserAuthenticated) { @@ -47,11 +158,11 @@ const useFetchChatData = (showRoles) => { } if (showRoles) { - const { roles } = await RCInstance.getChannelRoles(isChannelPrivate); - const fetchedAdmins = await RCInstance.getUsersInRole('admin'); - const adminUsernames = fetchedAdmins?.users?.map( - (user) => user.username - ); + const { roles } = await RCInstance.getChannelRoles(channelIsPrivate); + const fetchedRoles = await RCInstance.getUserRoles(); + const fetchedAdmins = fetchedRoles?.result; + + const adminUsernames = fetchedAdmins?.map((user) => user.username); setAdmins(adminUsernames); const rolesObj = @@ -71,8 +182,6 @@ const useFetchChatData = (showRoles) => { [ isUserAuthenticated, RCInstance, - ECOptions?.enableThreads, - isChannelPrivate, showRoles, setMessages, setAdmins, @@ -80,7 +189,47 @@ const useFetchChatData = (showRoles) => { ] ); - return getMessagesAndRoles; + const getStarredMessages = useCallback( + async (anonymousMode) => { + if (isUserAuthenticated) { + try { + if (!isUserAuthenticated && !anonymousMode) { + return; + } + const { messages } = await RCInstance.getStarredMessages(); + setStarredMessages(messages); + } catch (e) { + console.error(e); + } + } + }, + [isUserAuthenticated, RCInstance, setStarredMessages] + ); + + const getPinnedMessages = useCallback( + async (anonymousMode) => { + if (isUserAuthenticated) { + try { + if (!isUserAuthenticated && !anonymousMode) { + return; + } + const { messages } = await RCInstance.getPinnedMessages(); + setPinnedMessages(messages); + } catch (e) { + console.error(e); + } + } + }, + [isUserAuthenticated, RCInstance, setPinnedMessages] + ); + + return { + getMessagesAndRoles, + getStarredMessages, + getPinnedMessages, + fetchAndSetPermissions, + permissionsRef, + }; }; export default useFetchChatData; diff --git a/packages/react/src/hooks/useMediaRecorder.js b/packages/react/src/hooks/useMediaRecorder.js index 05046a59de..1c79fe20b3 100644 --- a/packages/react/src/hooks/useMediaRecorder.js +++ b/packages/react/src/hooks/useMediaRecorder.js @@ -1,4 +1,4 @@ -import { useState, useRef } from 'react'; +import { useState, useRef, useEffect } from 'react'; function useUserMedia(constraints, videoRef) { const [stream, setStream] = useState(); @@ -28,22 +28,115 @@ export function useMediaRecorder({ constraints, onStop, videoRef }) { const stream = await getStream(constraints, true); chunks.current = []; const _recorder = new MediaRecorder(stream); - _recorder.start(); - setRecorder(_recorder); - _recorder.addEventListener('dataavailable', (event) => { + + const handleDataAvailable = (event) => { chunks.current.push(event.data); - }); - _recorder.addEventListener('stop', () => { + }; + + const handleStop = () => { onStop && onStop(chunks.current); - }); + _recorder.removeEventListener('dataavailable', handleDataAvailable); + _recorder.removeEventListener('stop', handleStop); + }; + + _recorder.addEventListener('dataavailable', handleDataAvailable); + _recorder.addEventListener('stop', handleStop); + + _recorder.start(); + setRecorder(_recorder); } async function stop() { if (recorder) { - recorder.stop(); + if (recorder.state !== 'inactive') { + recorder.stop(); + } (await getStream()).getTracks().forEach((track) => track.stop()); } } return [start, stop]; } + +export function useNewMediaRecorder({ constraints, videoRef, onStop }) { + const [stream, setStream] = useState(); + const [isStreaming, setIsStreaming] = useState(false); + const [recorder, setRecorder] = useState(); + const [recordingData, setRecordingData] = useState(null); + const chunks = useRef([]); + + async function startCameraAndMic() { + if (isStreaming) return; + try { + const _stream = await navigator.mediaDevices.getUserMedia(constraints); + setStream(_stream); + setIsStreaming(true); + if (videoRef.current) { + videoRef.current.srcObject = _stream; + } + } catch (error) { + console.error('Error starting camera and mic:', error); + } + } + + async function startRecording() { + if (!isStreaming) { + console.error('Camera and mic must be on to start recording.'); + return; + } + + chunks.current = []; + const _recorder = new MediaRecorder(stream); + + const handleDataAvailable = (event) => { + chunks.current.push(event.data); + }; + + const handleStop = () => { + setRecordingData(new Blob(chunks.current, { type: 'video/mp4' })); + onStop && onStop(chunks.current); + _recorder.removeEventListener('dataavailable', handleDataAvailable); + _recorder.removeEventListener('stop', handleStop); + }; + + _recorder.addEventListener('dataavailable', handleDataAvailable); + _recorder.addEventListener('stop', handleStop); + + _recorder.start(); + setRecorder(_recorder); + } + + async function stopRecording() { + if (recorder && recorder.state === 'recording') { + recorder.stop(); + } + } + + function getRecording() { + return recordingData; + } + + function deleteRecording() { + setRecordingData(null); + chunks.current = []; + } + + function stopCameraAndMic() { + if (stream) { + stream.getTracks().forEach((track) => track.stop()); + setStream(null); + setIsStreaming(false); + } + } + + useEffect(() => () => stopCameraAndMic(), []); + + return { + startCameraAndMic, + startRecording, + stopRecording, + getRecording, + deleteRecording, + stopCameraAndMic, + }; +} diff --git a/packages/react/src/hooks/useRCAuth.js b/packages/react/src/hooks/useRCAuth.js index 83b013353b..385f300a06 100644 --- a/packages/react/src/hooks/useRCAuth.js +++ b/packages/react/src/hooks/useRCAuth.js @@ -50,9 +50,6 @@ export const useRCAuth = () => { if (res.status === 'success') { setIsLoginModalOpen(false); - setUserAvatarUrl(res.me.avatarUrl); - setAuthenticatedUserUsername(res.me.username); - setIsUserAuthenticated(true); setIsTotpModalOpen(false); setEmailorUser(null); setPassword(null); @@ -63,7 +60,12 @@ export const useRCAuth = () => { } } } catch (e) { - console.error('A error occurred while setting up user', e); + console.error('An error occurred while setting up user', e); + dispatchToastMessage({ + type: 'error', + message: + 'Unable to connect to server. Please check your connection and try again.', + }); } }; diff --git a/packages/react/src/hooks/useSearchEmoji.js b/packages/react/src/hooks/useSearchEmoji.js new file mode 100644 index 0000000000..7112fc3d81 --- /dev/null +++ b/packages/react/src/hooks/useSearchEmoji.js @@ -0,0 +1,67 @@ +import { useCallback } from 'react'; +import emojiList from '../lib/emojiList'; + +const useSearchEmoji = ( + startReadEmoji, + setStartReadEmoji, + setFilteredEmojis, + setEmojiIndex, + setShowEmojiList +) => + useCallback( + (message) => { + const lastChar = message ? message[message.length - 1] : ''; + + if (message.length === 0) { + setShowEmojiList(false); + setStartReadEmoji(false); + setFilteredEmojis([]); + setEmojiIndex(-1); + return; + } + + // Check if user is typing emoji syntax (:emoji:) + const emojiMatch = message.match(/:([a-zA-Z0-9_+-]*?)$/); + + if (emojiMatch) { + const query = emojiMatch[1].toLowerCase(); + + // Only show suggestions if query is at least 2 characters + if (query.length >= 2) { + setStartReadEmoji(true); + + const filteredEmojis = emojiList + .filter( + (emoji) => + emoji.shortname.toLowerCase().includes(query) || + emoji.aliases.some((alias) => + alias.toLowerCase().includes(query) + ) + ) + .slice(0, 10); + + setFilteredEmojis(filteredEmojis); + setEmojiIndex(filteredEmojis.length > 0 ? 0 : -1); + setShowEmojiList(filteredEmojis.length > 0); + } else { + setShowEmojiList(false); + setFilteredEmojis([]); + setEmojiIndex(-1); + } + } else if (startReadEmoji) { + setStartReadEmoji(false); + setFilteredEmojis([]); + setEmojiIndex(-1); + setShowEmojiList(false); + } + }, + [ + startReadEmoji, + setStartReadEmoji, + setFilteredEmojis, + setEmojiIndex, + setShowEmojiList, + ] + ); + +export default useSearchEmoji; diff --git a/packages/react/src/hooks/useSetMessageList.js b/packages/react/src/hooks/useSetMessageList.js index a2b3917d59..69b4bef7cf 100644 --- a/packages/react/src/hooks/useSetMessageList.js +++ b/packages/react/src/hooks/useSetMessageList.js @@ -1,16 +1,14 @@ -import { useState, useEffect } from 'react'; +import { useState, useEffect, useMemo } from 'react'; export const useSetMessageList = (messages, shouldRender) => { const [loading, setLoading] = useState(true); - const [messageList, setMessageList] = useState([]); - useEffect(() => { - setLoading(true); - const filteredMessages = messages.filter((message) => - shouldRender(message) - ); + const messageList = useMemo( + () => messages.filter(shouldRender), + [messages, shouldRender] + ); - setMessageList(filteredMessages); + useEffect(() => { setLoading(false); }, [messages, shouldRender]); diff --git a/packages/react/src/hooks/useShowCommands.js b/packages/react/src/hooks/useShowCommands.js index 1379f267c4..05115b6ce4 100644 --- a/packages/react/src/hooks/useShowCommands.js +++ b/packages/react/src/hooks/useShowCommands.js @@ -2,12 +2,11 @@ import { useCallback } from 'react'; const useShowCommands = (commands, setFilteredCommands, setShowCommandList) => useCallback( - async (e) => { + async (cursor, value) => { const getFilteredCommands = (cmd) => commands.filter((c) => c.command.startsWith(cmd.replace('/', ''))); - const cursor = e.target.selectionStart; - const tokens = e.target.value.slice(0, cursor).split(/\s+/); + const tokens = value.slice(0, cursor).split(/\s+/); if (tokens.length === 1 && tokens[0].startsWith('/')) { setFilteredCommands(getFilteredCommands(tokens[0])); diff --git a/packages/react/src/lib/emojiList.js b/packages/react/src/lib/emojiList.js new file mode 100644 index 0000000000..4aa794a7a0 --- /dev/null +++ b/packages/react/src/lib/emojiList.js @@ -0,0 +1,464 @@ +// Comprehensive list of popular emojis with emoji-toolkit compatible shortnames +// Based on the most commonly used emojis and matching Rocket.Chat's emoji autocomplete + +const emojiList = [ + // Popular smileys and emotions + { shortname: 'smile', emoji: '😊', aliases: ['happy', 'grinning'] }, + { shortname: 'laughing', emoji: '😂', aliases: ['joy', 'tears'] }, + { shortname: 'heart_eyes', emoji: '😍', aliases: ['love', 'heart'] }, + { shortname: 'kissing_heart', emoji: '😘', aliases: ['kiss', 'love'] }, + { shortname: 'wink', emoji: '😉', aliases: ['winking'] }, + { shortname: 'blush', emoji: '😊', aliases: ['smiling', 'happy'] }, + { shortname: 'grinning', emoji: '😀', aliases: ['grin', 'happy'] }, + { shortname: 'grin', emoji: '😁', aliases: ['grinning', 'happy'] }, + { shortname: 'joy', emoji: '😂', aliases: ['laughing', 'tears'] }, + { shortname: 'smiley', emoji: '😃', aliases: ['happy', 'grinning'] }, + { shortname: 'smirk', emoji: '😏', aliases: ['smirking'] }, + { shortname: 'relaxed', emoji: '☺️', aliases: ['smile', 'happy'] }, + { + shortname: 'stuck_out_tongue', + emoji: '😛', + aliases: ['tongue', 'playful'], + }, + { + shortname: 'stuck_out_tongue_winking_eye', + emoji: '😜', + aliases: ['wink', 'tongue'], + }, + { + shortname: 'stuck_out_tongue_closed_eyes', + emoji: '😝', + aliases: ['tongue', 'playful'], + }, + { shortname: 'kissing', emoji: '😗', aliases: ['kiss'] }, + { + shortname: 'kissing_smiling_eyes', + emoji: '😙', + aliases: ['kiss', 'happy'], + }, + { shortname: 'kissing_closed_eyes', emoji: '😚', aliases: ['kiss', 'love'] }, + { shortname: 'yum', emoji: '😋', aliases: ['delicious', 'tasty'] }, + { shortname: 'relieved', emoji: '😌', aliases: ['relief', 'sigh'] }, + { shortname: 'hugs', emoji: '🤗', aliases: ['hugging'] }, + { shortname: 'thinking', emoji: '🤔', aliases: ['thought', 'considering'] }, + { shortname: 'neutral_face', emoji: '😐', aliases: ['neutral', 'meh'] }, + { shortname: 'expressionless', emoji: '😑', aliases: ['blank', 'neutral'] }, + { shortname: 'no_mouth', emoji: '😶', aliases: ['mute', 'silent'] }, + { shortname: 'rolling_eyes', emoji: '🙄', aliases: ['eyeroll', 'sarcasm'] }, + { shortname: 'smiling_imp', emoji: '😈', aliases: ['devil', 'evil'] }, + { shortname: 'imp', emoji: '👿', aliases: ['devil', 'evil'] }, + { shortname: 'japanese_ogre', emoji: '👹', aliases: ['monster', 'ogre'] }, + { shortname: 'japanese_goblin', emoji: '👺', aliases: ['goblin', 'monster'] }, + { shortname: 'skull', emoji: '💀', aliases: ['death', 'dead'] }, + { shortname: 'ghost', emoji: '👻', aliases: ['spooky', 'halloween'] }, + { shortname: 'alien', emoji: '👽', aliases: ['ufo', 'extraterrestrial'] }, + { shortname: 'robot', emoji: '🤖', aliases: ['bot', 'automation'] }, + { shortname: 'smiley_cat', emoji: '😸', aliases: ['cat', 'happy'] }, + { shortname: 'smile_cat', emoji: '😹', aliases: ['cat', 'laughing'] }, + { shortname: 'joy_cat', emoji: '😻', aliases: ['cat', 'love'] }, + { shortname: 'heart_eyes_cat', emoji: '😻', aliases: ['cat', 'love'] }, + { shortname: 'smirk_cat', emoji: '😼', aliases: ['cat', 'smirk'] }, + { shortname: 'kissing_cat', emoji: '😽', aliases: ['cat', 'kiss'] }, + { shortname: 'scream_cat', emoji: '🙀', aliases: ['cat', 'scared'] }, + { shortname: 'crying_cat_face', emoji: '😿', aliases: ['cat', 'cry', 'sad'] }, + { shortname: 'pouting_cat', emoji: '😾', aliases: ['cat', 'angry'] }, + + // Hand gestures + { shortname: 'thumbsup', emoji: '👍', aliases: ['yes', 'good', 'approve'] }, + { + shortname: 'thumbsdown', + emoji: '👎', + aliases: ['no', 'bad', 'disapprove'], + }, + { shortname: 'clap', emoji: '👏', aliases: ['applause', 'bravo'] }, + { shortname: 'open_hands', emoji: '👐', aliases: ['open', 'hands'] }, + { shortname: 'palms_up_together', emoji: '🤲', aliases: ['prayer', 'hands'] }, + { shortname: 'handshake', emoji: '🤝', aliases: ['deal', 'agreement'] }, + { shortname: 'pray', emoji: '🙏', aliases: ['please', 'thanks', 'hope'] }, + { shortname: 'writing_hand', emoji: '✍️', aliases: ['write', 'signature'] }, + { shortname: 'nail_care', emoji: '💅', aliases: ['nail', 'polish'] }, + { shortname: 'selfie', emoji: '🤳', aliases: ['camera', 'photo'] }, + { shortname: 'muscle', emoji: '💪', aliases: ['strong', 'flex', 'biceps'] }, + { shortname: 'mechanical_arm', emoji: '🦾', aliases: ['arm', 'robot'] }, + { shortname: 'mechanical_leg', emoji: '🦿', aliases: ['leg', 'robot'] }, + { shortname: 'leg', emoji: '🦵', aliases: ['kick', 'limb'] }, + { shortname: 'foot', emoji: '🦶', aliases: ['kick', 'limb'] }, + { shortname: 'ear', emoji: '👂', aliases: ['listen', 'hear'] }, + { + shortname: 'ear_with_hearing_aid', + emoji: '🦻', + aliases: ['hearing', 'aid'], + }, + { shortname: 'nose', emoji: '👃', aliases: ['smell', 'sniff'] }, + { shortname: 'brain', emoji: '🧠', aliases: ['think', 'smart'] }, + { shortname: 'anatomical_heart', emoji: '🫀', aliases: ['heart', 'health'] }, + { shortname: 'lungs', emoji: '🫁', aliases: ['breath', 'health'] }, + { shortname: 'tooth', emoji: '🦷', aliases: ['dental', 'health'] }, + { shortname: 'bone', emoji: '🦴', aliases: ['skeleton', 'health'] }, + { shortname: 'eyes', emoji: '👀', aliases: ['see', 'look', 'watch'] }, + { shortname: 'eye', emoji: '👁️', aliases: ['see', 'look'] }, + { shortname: 'tongue', emoji: '👅', aliases: ['taste', 'lick'] }, + { shortname: 'lips', emoji: '👄', aliases: ['kiss', 'mouth'] }, + + // Hearts and symbols + { shortname: 'heart', emoji: '❤️', aliases: ['love', 'red'] }, + { shortname: 'orange_heart', emoji: '🧡', aliases: ['love', 'orange'] }, + { shortname: 'yellow_heart', emoji: '💛', aliases: ['love', 'yellow'] }, + { shortname: 'green_heart', emoji: '💚', aliases: ['love', 'green'] }, + { shortname: 'blue_heart', emoji: '💙', aliases: ['love', 'blue'] }, + { shortname: 'purple_heart', emoji: '💜', aliases: ['love', 'purple'] }, + { shortname: 'black_heart', emoji: '🖤', aliases: ['love', 'black'] }, + { shortname: 'white_heart', emoji: '🤍', aliases: ['love', 'white'] }, + { shortname: 'brown_heart', emoji: '🤎', aliases: ['love', 'brown'] }, + { shortname: 'broken_heart', emoji: '💔', aliases: ['sad', 'broken'] }, + { + shortname: 'heart_exclamation', + emoji: '❣️', + aliases: ['love', 'exclamation'], + }, + { shortname: 'two_hearts', emoji: '💕', aliases: ['love', 'two'] }, + { + shortname: 'revolving_hearts', + emoji: '💞', + aliases: ['love', 'revolving'], + }, + { shortname: 'heartbeat', emoji: '💓', aliases: ['love', 'beat'] }, + { shortname: 'heartpulse', emoji: '💗', aliases: ['love', 'pulse'] }, + { shortname: 'heart_eyes', emoji: '😍', aliases: ['love', 'heart'] }, + { shortname: 'sparkling_heart', emoji: '💖', aliases: ['love', 'sparkle'] }, + { shortname: 'cupid', emoji: '💘', aliases: ['love', 'arrow'] }, + { shortname: 'gift_heart', emoji: '💝', aliases: ['love', 'gift'] }, + { + shortname: 'heart_decoration', + emoji: '💟', + aliases: ['love', 'decoration'], + }, + { shortname: 'peace_symbol', emoji: '☮️', aliases: ['peace', 'symbol'] }, + { shortname: 'latin_cross', emoji: '✝️', aliases: ['cross', 'christian'] }, + { shortname: 'star_and_crescent', emoji: '☪️', aliases: ['islam', 'muslim'] }, + { shortname: 'om', emoji: '🕉️', aliases: ['hindu', 'om'] }, + { + shortname: 'wheel_of_dharma', + emoji: '☸️', + aliases: ['buddhism', 'dharma'], + }, + { shortname: 'star_of_david', emoji: '✡️', aliases: ['judaism', 'star'] }, + { shortname: 'six_pointed_star', emoji: '🔯', aliases: ['star', 'jewish'] }, + { shortname: 'menorah', emoji: '🕎', aliases: ['hanukkah', 'candles'] }, + { shortname: 'yin_yang', emoji: '☯️', aliases: ['balance', 'tao'] }, + { shortname: 'orthodox_cross', emoji: '☦️', aliases: ['christian', 'cross'] }, + { + shortname: 'place_of_worship', + emoji: '🛐', + aliases: ['worship', 'religion'], + }, + { shortname: 'ophiuchus', emoji: '⛎', aliases: ['snake', 'zodiac'] }, + { shortname: 'aries', emoji: '♈', aliases: ['ram', 'zodiac'] }, + { shortname: 'taurus', emoji: '♉', aliases: ['bull', 'zodiac'] }, + { shortname: 'gemini', emoji: '♊', aliases: ['twins', 'zodiac'] }, + { shortname: 'cancer', emoji: '♋', aliases: ['crab', 'zodiac'] }, + { shortname: 'leo', emoji: '♌', aliases: ['lion', 'zodiac'] }, + { shortname: 'virgo', emoji: '♍', aliases: ['maiden', 'zodiac'] }, + { shortname: 'libra', emoji: '♎', aliases: ['scales', 'zodiac'] }, + { shortname: 'scorpius', emoji: '♏', aliases: ['scorpion', 'zodiac'] }, + { shortname: 'sagittarius', emoji: '♐', aliases: ['archer', 'zodiac'] }, + { shortname: 'capricorn', emoji: '♑', aliases: ['goat', 'zodiac'] }, + { shortname: 'aquarius', emoji: '♒', aliases: ['water', 'zodiac'] }, + { shortname: 'pisces', emoji: '♓', aliases: ['fish', 'zodiac'] }, + { shortname: 'id', emoji: '🆔', aliases: ['identification', 'id'] }, + { shortname: 'atom_symbol', emoji: '⚛️', aliases: ['atom', 'science'] }, + { shortname: 'u7a7a', emoji: '🈳', aliases: ['japanese', 'empty'] }, + { shortname: 'u5272', emoji: '🈹', aliases: ['japanese', 'discount'] }, + { + shortname: 'radioactive', + emoji: '☢️', + aliases: ['nuclear', 'radioactive'], + }, + { shortname: 'biohazard', emoji: '☣️', aliases: ['danger', 'biohazard'] }, + { shortname: 'mobile_phone_off', emoji: '📴', aliases: ['off', 'phone'] }, + { shortname: 'vibration_mode', emoji: '📳', aliases: ['vibrate', 'phone'] }, + { shortname: 'u6709', emoji: '🈶', aliases: ['japanese', 'available'] }, + { shortname: 'u7121', emoji: '🈚', aliases: ['japanese', 'not'] }, + { shortname: 'u7533', emoji: '🈸', aliases: ['japanese', 'application'] }, + { shortname: 'u55b6', emoji: '🈺', aliases: ['japanese', 'open'] }, + { shortname: 'u6708', emoji: '🈷️', aliases: ['japanese', 'monthly'] }, + { + shortname: 'eight_pointed_black_star', + emoji: '✴️', + aliases: ['star', 'eight'], + }, + { shortname: 'vs', emoji: '🆚', aliases: ['versus', 'vs'] }, + { shortname: 'accept', emoji: '🉑', aliases: ['japanese', 'acceptable'] }, + { shortname: 'white_flower', emoji: '💮', aliases: ['flower', 'white'] }, + { + shortname: 'ideograph_advantage', + emoji: '🉐', + aliases: ['japanese', 'advantage'], + }, + { shortname: 'secret', emoji: '㊙️', aliases: ['japanese', 'secret'] }, + { + shortname: 'congratulations', + emoji: '㊗️', + aliases: ['japanese', 'congratulations'], + }, + { shortname: 'u5408', emoji: '🈴', aliases: ['japanese', 'congratulation'] }, + { shortname: 'u6e80', emoji: '🈵', aliases: ['japanese', 'full'] }, + { shortname: 'u7981', emoji: '🈲', aliases: ['japanese', 'prohibited'] }, + { shortname: 'a', emoji: '🅰️', aliases: ['blood', 'type'] }, + { shortname: 'b', emoji: '🅱️', aliases: ['blood', 'type'] }, + { shortname: 'ab', emoji: '🆎', aliases: ['blood', 'type'] }, + { shortname: 'cl', emoji: '🆑', aliases: ['clear', 'clear'] }, + { shortname: 'o2', emoji: '🅾️', aliases: ['blood', 'type'] }, + { shortname: 'sos', emoji: '🆘', aliases: ['help', 'emergency'] }, + { shortname: 'no_entry', emoji: '⛔', aliases: ['no', 'entry'] }, + { shortname: 'name_badge', emoji: '📛', aliases: ['name', 'badge'] }, + { shortname: 'no_entry_sign', emoji: '🚫', aliases: ['no', 'entry'] }, + { shortname: 'x', emoji: '❌', aliases: ['no', 'cross'] }, + { shortname: 'o', emoji: '⭕', aliases: ['yes', 'circle'] }, + { shortname: 'stop_sign', emoji: '🛑', aliases: ['stop', 'sign'] }, + { shortname: 'anger', emoji: '💢', aliases: ['angry', 'mad'] }, + { shortname: 'hotsprings', emoji: '♨️', aliases: ['hot', 'springs'] }, + { shortname: 'no_pedestrians', emoji: '🚷', aliases: ['no', 'pedestrians'] }, + { shortname: 'do_not_litter', emoji: '🚯', aliases: ['no', 'litter'] }, + { shortname: 'no_bicycles', emoji: '🚳', aliases: ['no', 'bicycles'] }, + { shortname: 'non-potable_water', emoji: '🚱', aliases: ['no', 'water'] }, + { shortname: 'underage', emoji: '🔞', aliases: ['underage', '18'] }, + { shortname: 'no_mobile_phones', emoji: '📵', aliases: ['no', 'phone'] }, + { + shortname: 'exclamation', + emoji: '❗', + aliases: ['exclamation', 'warning'], + }, + { + shortname: 'grey_exclamation', + emoji: '❕', + aliases: ['exclamation', 'grey'], + }, + { shortname: 'question', emoji: '❓', aliases: ['question', 'help'] }, + { shortname: 'grey_question', emoji: '❔', aliases: ['question', 'grey'] }, + { shortname: 'bangbang', emoji: '‼️', aliases: ['exclamation', 'double'] }, + { + shortname: 'interrobang', + emoji: '⁉️', + aliases: ['exclamation', 'question'], + }, + { shortname: '100', emoji: '💯', aliases: ['hundred', 'perfect'] }, + { shortname: 'low_brightness', emoji: '🔅', aliases: ['dim', 'brightness'] }, + { + shortname: 'high_brightness', + emoji: '🔆', + aliases: ['bright', 'brightness'], + }, + { shortname: 'trident', emoji: '🔱', aliases: ['trident', 'fork'] }, + { shortname: 'fleur_de_lis', emoji: '⚜️', aliases: ['fleur', 'lily'] }, + { + shortname: 'part_alternation_mark', + emoji: '〽️', + aliases: ['japanese', 'part'], + }, + { shortname: 'warning', emoji: '⚠️', aliases: ['warning', 'caution'] }, + { + shortname: 'children_crossing', + emoji: '🚸', + aliases: ['children', 'crossing'], + }, + { shortname: 'beginner', emoji: '🔰', aliases: ['beginner', 'leaf'] }, + { shortname: 'recycle', emoji: '♻️', aliases: ['recycle', 'green'] }, + { shortname: 'u6307', emoji: '🈯', aliases: ['japanese', 'point'] }, + { shortname: 'chart', emoji: '💹', aliases: ['chart', 'yen'] }, + { shortname: 'sparkle', emoji: '✨', aliases: ['sparkle', 'shine'] }, + { + shortname: 'eight_spoked_asterisk', + emoji: '✳️', + aliases: ['asterisk', 'eight'], + }, + { + shortname: 'negative_squared_cross_mark', + emoji: '❎', + aliases: ['no', 'cross'], + }, + { shortname: 'white_check_mark', emoji: '✅', aliases: ['yes', 'check'] }, + { + shortname: 'diamond_shape_with_a_dot_inside', + emoji: '💠', + aliases: ['diamond', 'dot'], + }, + { shortname: 'cyclone', emoji: '🌀', aliases: ['cyclone', 'spiral'] }, + { shortname: 'loop', emoji: '➿', aliases: ['loop', 'curly'] }, + { + shortname: 'globe_with_meridians', + emoji: '🌐', + aliases: ['globe', 'world'], + }, + { shortname: 'm', emoji: 'Ⓜ️', aliases: ['metro', 'm'] }, + { shortname: 'atm', emoji: '🏧', aliases: ['atm', 'cash'] }, + { shortname: 'sa', emoji: '🈂️', aliases: ['japanese', 'service'] }, + { + shortname: 'passport_control', + emoji: '🛂', + aliases: ['passport', 'control'], + }, + { shortname: 'customs', emoji: '🛃', aliases: ['customs', 'border'] }, + { shortname: 'baggage_claim', emoji: '🛄', aliases: ['baggage', 'claim'] }, + { shortname: 'left_luggage', emoji: '🛅', aliases: ['left', 'luggage'] }, + { + shortname: 'wheelchair', + emoji: '♿', + aliases: ['wheelchair', 'accessibility'], + }, + { shortname: 'no_smoking', emoji: '🚭', aliases: ['no', 'smoking'] }, + { shortname: 'wc', emoji: '🚾', aliases: ['toilet', 'wc'] }, + { shortname: 'parking', emoji: '🅿️', aliases: ['parking', 'p'] }, + { shortname: 'potable_water', emoji: '🚰', aliases: ['water', 'drinking'] }, + { shortname: 'mens', emoji: '🚹', aliases: ['men', 'male'] }, + { shortname: 'womens', emoji: '🚺', aliases: ['women', 'female'] }, + { shortname: 'baby_symbol', emoji: '🚼', aliases: ['baby', 'symbol'] }, + { shortname: 'restroom', emoji: '🚻', aliases: ['restroom', 'toilet'] }, + { + shortname: 'put_litter_in_its_place', + emoji: '🚮', + aliases: ['litter', 'bin'], + }, + { shortname: 'cinema', emoji: '🎦', aliases: ['cinema', 'movie'] }, + { + shortname: 'signal_strength', + emoji: '📶', + aliases: ['signal', 'strength'], + }, + { shortname: 'koko', emoji: '🈁', aliases: ['japanese', 'here'] }, + { shortname: 'ng', emoji: '🆖', aliases: ['ng', 'no'] }, + { shortname: 'ok', emoji: '🆗', aliases: ['ok', 'okay'] }, + { shortname: 'up', emoji: '🆙', aliases: ['up', 'arrow'] }, + { shortname: 'cool', emoji: '🆒', aliases: ['cool', 'fresh'] }, + { shortname: 'new', emoji: '🆕', aliases: ['new', 'fresh'] }, + { shortname: 'free', emoji: '🆓', aliases: ['free', 'complimentary'] }, + { shortname: 'zero', emoji: '0️⃣', aliases: ['zero', '0'] }, + { shortname: 'one', emoji: '1️⃣', aliases: ['one', '1'] }, + { shortname: 'two', emoji: '2️⃣', aliases: ['two', '2'] }, + { shortname: 'three', emoji: '3️⃣', aliases: ['three', '3'] }, + { shortname: 'four', emoji: '4️⃣', aliases: ['four', '4'] }, + { shortname: 'five', emoji: '5️⃣', aliases: ['five', '5'] }, + { shortname: 'six', emoji: '6️⃣', aliases: ['six', '6'] }, + { shortname: 'seven', emoji: '7️⃣', aliases: ['seven', '7'] }, + { shortname: 'eight', emoji: '8️⃣', aliases: ['eight', '8'] }, + { shortname: 'nine', emoji: '9️⃣', aliases: ['nine', '9'] }, + { shortname: 'keycap_ten', emoji: '🔟', aliases: ['ten', '10'] }, + + // Additional popular emojis + { shortname: 'fire', emoji: '🔥', aliases: ['hot', 'flame'] }, + { shortname: 'boom', emoji: '💥', aliases: ['explosion', 'bang'] }, + { shortname: 'collision', emoji: '💥', aliases: ['explosion', 'bang'] }, + { shortname: 'sweat_drops', emoji: '💦', aliases: ['water', 'drops'] }, + { shortname: 'droplet', emoji: '💧', aliases: ['water', 'drop'] }, + { shortname: 'dash', emoji: '💨', aliases: ['wind', 'fast'] }, + { shortname: 'hole', emoji: '🕳️', aliases: ['hole', 'dark'] }, + { shortname: 'bomb', emoji: '💣', aliases: ['bomb', 'explosive'] }, + { shortname: 'speech_balloon', emoji: '💬', aliases: ['speech', 'bubble'] }, + { shortname: 'eye_speech_bubble', emoji: '👁️‍🗨️', aliases: ['eye', 'speech'] }, + { shortname: 'left_speech_bubble', emoji: '🗨️', aliases: ['left', 'speech'] }, + { shortname: 'right_anger_bubble', emoji: '🗯️', aliases: ['right', 'anger'] }, + { shortname: 'thought_balloon', emoji: '💭', aliases: ['thought', 'bubble'] }, + { shortname: 'zzz', emoji: '💤', aliases: ['sleep', 'tired'] }, + { shortname: 'wave', emoji: '👋', aliases: ['hello', 'goodbye'] }, + { shortname: 'raised_back_of_hand', emoji: '🤚', aliases: ['stop', 'hand'] }, + { + shortname: 'raised_hand_with_fingers_splayed', + emoji: '🖐️', + aliases: ['stop', 'hand'], + }, + { shortname: 'hand', emoji: '✋', aliases: ['stop', 'hand'] }, + { shortname: 'spock-hand', emoji: '🖖', aliases: ['spock', 'vulcan'] }, + { shortname: 'the_horns', emoji: '🤘', aliases: ['rock', 'metal'] }, + { shortname: 'call_me_hand', emoji: '🤙', aliases: ['call', 'phone'] }, + { shortname: 'point_left', emoji: '👈', aliases: ['left', 'point'] }, + { shortname: 'point_right', emoji: '👉', aliases: ['right', 'point'] }, + { shortname: 'point_up_2', emoji: '👆', aliases: ['up', 'point'] }, + { shortname: 'middle_finger', emoji: '🖕', aliases: ['middle', 'finger'] }, + { shortname: 'point_down', emoji: '👇', aliases: ['down', 'point'] }, + { shortname: 'point_up', emoji: '☝️', aliases: ['up', 'point'] }, + { shortname: 'point_up_2', emoji: '👆', aliases: ['up', 'point'] }, + { shortname: 'crossed_fingers', emoji: '🤞', aliases: ['luck', 'cross'] }, + { shortname: 'love_you_gesture', emoji: '🤟', aliases: ['love', 'you'] }, + { shortname: 'metal', emoji: '🤘', aliases: ['rock', 'metal'] }, + { shortname: 'vulcan_salute', emoji: '🖖', aliases: ['spock', 'vulcan'] }, + { + shortname: 'index_pointing_at_the_viewer', + emoji: '🫵', + aliases: ['point', 'you'], + }, + { shortname: 'palms_up_together', emoji: '🤲', aliases: ['prayer', 'hands'] }, + { shortname: 'back_of_hand', emoji: '🤚', aliases: ['back', 'hand'] }, + { + shortname: 'hand_with_index_finger_and_thumb_crossed', + emoji: '🤌', + aliases: ['pinch', 'money'], + }, + { shortname: 'index_pointing_up', emoji: '☝️', aliases: ['up', 'point'] }, + { + shortname: 'index_pointing_at_the_viewer_dark_skin_tone', + emoji: '🫵🏿', + aliases: ['point', 'you', 'dark'], + }, + { + shortname: 'index_pointing_at_the_viewer_light_skin_tone', + emoji: '🫵🏻', + aliases: ['point', 'you', 'light'], + }, + { + shortname: 'index_pointing_at_the_viewer_medium_dark_skin_tone', + emoji: '🫵🏾', + aliases: ['point', 'you', 'medium_dark'], + }, + { + shortname: 'index_pointing_at_the_viewer_medium_light_skin_tone', + emoji: '🫵🏼', + aliases: ['point', 'you', 'medium_light'], + }, + { + shortname: 'index_pointing_at_the_viewer_medium_skin_tone', + emoji: '🫵🏽', + aliases: ['point', 'you', 'medium'], + }, + { shortname: 'thumbs_up', emoji: '👍', aliases: ['yes', 'good', 'approve'] }, + { + shortname: 'thumbs_down', + emoji: '👎', + aliases: ['no', 'bad', 'disapprove'], + }, + { shortname: 'raised_fist', emoji: '✊', aliases: ['fist', 'punch'] }, + { shortname: 'oncoming_fist', emoji: '👊', aliases: ['fist', 'punch'] }, + { shortname: 'left_facing_fist', emoji: '🤛', aliases: ['fist', 'left'] }, + { shortname: 'right_facing_fist', emoji: '🤜', aliases: ['fist', 'right'] }, + { shortname: 'clap', emoji: '👏', aliases: ['applause', 'bravo'] }, + { shortname: 'raised_hands', emoji: '🙌', aliases: ['celebration', 'hands'] }, + { shortname: 'open_hands', emoji: '👐', aliases: ['open', 'hands'] }, + { shortname: 'palms_up_together', emoji: '🤲', aliases: ['prayer', 'hands'] }, + { shortname: 'handshake', emoji: '🤝', aliases: ['deal', 'agreement'] }, + { shortname: 'pray', emoji: '🙏', aliases: ['please', 'thanks', 'hope'] }, + { shortname: 'writing_hand', emoji: '✍️', aliases: ['write', 'signature'] }, + { shortname: 'nail_care', emoji: '💅', aliases: ['nail', 'polish'] }, + { shortname: 'selfie', emoji: '🤳', aliases: ['camera', 'photo'] }, + { shortname: 'muscle', emoji: '💪', aliases: ['strong', 'flex', 'biceps'] }, + { shortname: 'mechanical_arm', emoji: '🦾', aliases: ['arm', 'robot'] }, + { shortname: 'mechanical_leg', emoji: '🦿', aliases: ['leg', 'robot'] }, + { shortname: 'leg', emoji: '🦵', aliases: ['kick', 'limb'] }, + { shortname: 'foot', emoji: '🦶', aliases: ['kick', 'limb'] }, + { shortname: 'ear', emoji: '👂', aliases: ['listen', 'hear'] }, + { + shortname: 'ear_with_hearing_aid', + emoji: '🦻', + aliases: ['hearing', 'aid'], + }, + { shortname: 'nose', emoji: '👃', aliases: ['smell', 'sniff'] }, + { shortname: 'brain', emoji: '🧠', aliases: ['think', 'smart'] }, + { shortname: 'anatomical_heart', emoji: '🫀', aliases: ['heart', 'health'] }, + { shortname: 'lungs', emoji: '🫁', aliases: ['breath', 'health'] }, + { shortname: 'tooth', emoji: '🦷', aliases: ['dental', 'health'] }, + { shortname: 'bone', emoji: '🦴', aliases: ['skeleton', 'health'] }, + { shortname: 'eyes', emoji: '👀', aliases: ['see', 'look', 'watch'] }, + { shortname: 'eye', emoji: '👁️', aliases: ['see', 'look'] }, + { shortname: 'tongue', emoji: '👅', aliases: ['taste', 'lick'] }, + { shortname: 'lips', emoji: '👄', aliases: ['kiss', 'mouth'] }, +]; + +export default emojiList; diff --git a/packages/react/src/lib/formatTimestampGetDate.js b/packages/react/src/lib/formatTimestampGetDate.js new file mode 100644 index 0000000000..856799fcf9 --- /dev/null +++ b/packages/react/src/lib/formatTimestampGetDate.js @@ -0,0 +1,10 @@ +const formatTimestampGetDate = (timestamp) => { + const date = new Date(timestamp); + return date.toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric', + }); +}; + +export default formatTimestampGetDate; diff --git a/packages/react/src/lib/textFormat.js b/packages/react/src/lib/textFormat.js index 10ceb7f33c..7bdff292b0 100644 --- a/packages/react/src/lib/textFormat.js +++ b/packages/react/src/lib/textFormat.js @@ -1,7 +1,27 @@ export const formatter = [ - { name: 'bold', pattern: '*{{text}}*' }, - { name: 'italic', pattern: '_{{text}}_' }, - { name: 'strike', pattern: '~{{text}}~' }, - { name: 'code', pattern: '`{{text}}`' }, - { name: 'multiline', pattern: '```\n{{text}}\n``` ' }, + { + name: 'bold', + pattern: '*{{text}}*', + tooltip: 'Bold', + shortcut: 'Ctrl + B', + }, + { + name: 'italic', + pattern: '_{{text}}_', + tooltip: 'Italic', + shortcut: 'Ctrl + I', + }, + { + name: 'strike', + pattern: '~{{text}}~', + tooltip: 'Strikethrough', + shortcut: '', + }, + { name: 'code', pattern: '`{{text}}`', tooltip: 'Inline code', shortcut: '' }, + { + name: 'multiline', + pattern: '```\n{{text}}\n```', + tooltip: 'Multi-line code', + shortcut: '', + }, ]; diff --git a/packages/react/src/store/channelStore.js b/packages/react/src/store/channelStore.js index 2ba08bddb4..21d036c52a 100644 --- a/packages/react/src/store/channelStore.js +++ b/packages/react/src/store/channelStore.js @@ -4,10 +4,15 @@ const useChannelStore = create((set) => ({ showChannelinfo: false, isChannelPrivate: false, isChannelReadOnly: false, + isChannelArchived: false, + isRoomTeam: false, setShowChannelinfo: (showChannelinfo) => set(() => ({ showChannelinfo })), channelInfo: {}, setChannelInfo: (channelInfo) => set(() => ({ channelInfo })), setIsChannelPrivate: (isChannelPrivate) => set(() => ({ isChannelPrivate })), + setIsChannelArchived: (isChannelArchived) => + set(() => ({ isChannelArchived })), + setIsRoomTeam: (isRoomTeam) => set(() => ({ isRoomTeam })), setIsChannelReadOnly: (isChannelReadOnly) => set(() => ({ isChannelReadOnly })), })); diff --git a/packages/react/src/store/messageStore.js b/packages/react/src/store/messageStore.js index 012a97e1ed..4f84f8c1f8 100644 --- a/packages/react/src/store/messageStore.js +++ b/packages/react/src/store/messageStore.js @@ -8,7 +8,12 @@ const useMessageStore = create((set, get) => ({ threadMessages: [], filtered: false, editMessage: {}, - quoteMessage: {}, + deletedMessage: {}, + messagesOffset: 0, + quoteMessage: [], + deleteMessageRoles: {}, + deleteOwnMessageRoles: {}, + forceDeleteMessageRoles: {}, messageToReport: NaN, showReportMessage: false, isRecordingMessage: false, @@ -16,11 +21,19 @@ const useMessageStore = create((set, get) => ({ threadMainMessage: null, headerTitle: null, setFilter: (filter) => set(() => ({ filtered: filter })), - setMessages: (messages) => - set(() => ({ - messages, - isMessageLoaded: true, - })), + setMessages: (newMessages, append = false) => + set((state) => { + const allMessages = append + ? [...state.messages, ...newMessages] + : newMessages; + const uniqueMessages = Array.from( + new Map(allMessages.map((msg) => [msg._id, msg])).values() + ); + return { + messages: uniqueMessages, + isMessageLoaded: true, + }; + }), upsertMessage: (message, enableThreads = false) => { if (message.tmid && enableThreads) { if (get().threadMainMessage?._id === message.tmid) { @@ -39,6 +52,7 @@ const useMessageStore = create((set, get) => ({ const message = get().messages.find((m) => m._id === messageId); if (threadMessage) { return set((state) => ({ + deletedMessage: threadMessage, threadMessages: cloneArray(state.threadMessages).filter( (m) => m._id !== messageId ), @@ -46,6 +60,7 @@ const useMessageStore = create((set, get) => ({ } if (message) { return set((state) => ({ + deletedMessage: message, messages: cloneArray(state.messages).filter((m) => m._id !== messageId), })); } @@ -71,7 +86,23 @@ const useMessageStore = create((set, get) => ({ } }, setEditMessage: (editMessage) => set(() => ({ editMessage })), - setQuoteMessage: (quoteMessage) => set(() => ({ quoteMessage })), + setMessagesOffset: (newOffset) => set(() => ({ messagesOffset: newOffset })), + editMessagePermissions: {}, + setEditMessagePermissions: (editMessagePermissions) => + set((state) => ({ ...state, editMessagePermissions })), + addQuoteMessage: (quoteMessage) => + set((state) => { + const updatedQuoteMessages = state.quoteMessage.filter( + (msg) => msg._id !== quoteMessage._id + ); + return { quoteMessage: [...updatedQuoteMessages, quoteMessage] }; + }), + removeQuoteMessage: (quoteMessage) => + set((state) => ({ + quoteMessage: state.quoteMessage.filter((i) => i !== quoteMessage), + })), + + clearQuoteMessages: () => set({ quoteMessage: [] }), setMessageToReport: (messageId) => set(() => ({ messageToReport: messageId })), toggleShowReportMessage: () => { @@ -96,6 +127,12 @@ const useMessageStore = create((set, get) => ({ threadMessages: [], })); }, + setDeleteMessageRoles: (deleteMessageRoles) => + set((state) => ({ ...state, deleteMessageRoles })), + setDeleteOwnMessageRoles: (deleteOwnMessageRoles) => + set((state) => ({ ...state, deleteOwnMessageRoles })), + setForceDeleteMessageRoles: (forceDeleteMessageRoles) => + set((state) => ({ ...state, forceDeleteMessageRoles })), setThreadMessages: (messages) => set(() => ({ threadMessages: messages })), setHeaderTitle: (title) => set(() => ({ headerTitle: title })), })); diff --git a/packages/react/src/store/pinnedMessageStore.js b/packages/react/src/store/pinnedMessageStore.js index 36ee4e3851..fd1562b0c8 100644 --- a/packages/react/src/store/pinnedMessageStore.js +++ b/packages/react/src/store/pinnedMessageStore.js @@ -3,6 +3,8 @@ import { create } from 'zustand'; const usePinnedMessageStore = create((set) => ({ showPinned: false, setShowPinned: (showPinned) => set(() => ({ showPinned })), + pinnedMessages: [], + setPinnedMessages: (messages) => set(() => ({ pinnedMessages: messages })), })); export default usePinnedMessageStore; diff --git a/packages/react/src/store/settingsStore.js b/packages/react/src/store/settingsStore.js index 4f9d78b687..a8ba42e96b 100644 --- a/packages/react/src/store/settingsStore.js +++ b/packages/react/src/store/settingsStore.js @@ -1,8 +1,16 @@ import { create } from 'zustand'; +const DEFAULT_MESSAGE_LIMIT = 5000; + const useSettingsStore = create((set) => ({ - messageLimit: 5000, - setMessageLimit: (messageLimit) => set(() => ({ messageLimit })), + messageLimit: DEFAULT_MESSAGE_LIMIT, + setMessageLimit: (messageLimit) => + set(() => ({ + messageLimit: + typeof messageLimit === 'number' && Number.isFinite(messageLimit) + ? messageLimit + : DEFAULT_MESSAGE_LIMIT, + })), })); export default useSettingsStore; diff --git a/packages/react/src/store/starredMessageStore.js b/packages/react/src/store/starredMessageStore.js index a564df3c41..989ec8b6fb 100644 --- a/packages/react/src/store/starredMessageStore.js +++ b/packages/react/src/store/starredMessageStore.js @@ -3,6 +3,8 @@ import { create } from 'zustand'; const useStarredMessageStore = create((set) => ({ showStarred: false, setShowStarred: (showStarred) => set(() => ({ showStarred })), + starredMessages: [], + setStarredMessages: (messages) => set(() => ({ starredMessages: messages })), })); export default useStarredMessageStore; diff --git a/packages/react/src/store/userStore.js b/packages/react/src/store/userStore.js index c4128cf468..a19fef4714 100644 --- a/packages/react/src/store/userStore.js +++ b/packages/react/src/store/userStore.js @@ -27,8 +27,14 @@ const useUserStore = create((set) => ({ setPassword: (password) => set(() => ({ password })), emailoruser: null, setEmailorUser: (emailoruser) => set(() => ({ emailoruser })), - roles: {}, + roles: [], setRoles: (roles) => set((state) => ({ ...state, roles })), + userPinPermissions: {}, + setUserPinPermissions: (userPinPermissions) => + set((state) => ({ ...state, userPinPermissions })), + viewUserInfoPermissions: {}, + setViewUserInfoPermissions: (viewUserInfoPermissions) => + set((state) => ({ ...state, viewUserInfoPermissions })), showCurrentUserInfo: false, setShowCurrentUserInfo: (showCurrentUserInfo) => set(() => ({ showCurrentUserInfo })), diff --git a/packages/react/src/views/AttachmentHandler/Attachment.js b/packages/react/src/views/AttachmentHandler/Attachment.js index bc07a740c1..20c329138d 100644 --- a/packages/react/src/views/AttachmentHandler/Attachment.js +++ b/packages/react/src/views/AttachmentHandler/Attachment.js @@ -1,19 +1,23 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { css } from '@emotion/react'; -import { Box, Icon } from '@embeddedchat/ui-elements'; import ImageAttachment from './ImageAttachment'; import AudioAttachment from './AudioAttachment'; import VideoAttachment from './VideoAttachment'; -import TextAttachment from './TextAttachment'; +import FileAttachment from './TextAttachment'; -const Attachment = ({ attachment, host, type, variantStyles = {} }) => { +const Attachment = ({ attachment, host, type, variantStyles = {}, msg }) => { + const author = { + authorIcon: attachment?.author_icon, + authorName: attachment?.author_name, + }; if (attachment && attachment.audio_url) { return ( ); } @@ -22,7 +26,9 @@ const Attachment = ({ attachment, host, type, variantStyles = {} }) => { ); } @@ -31,30 +37,66 @@ const Attachment = ({ attachment, host, type, variantStyles = {} }) => { ); } - if (attachment && attachment.text) { + if ( + attachment.attachments && + Array.isArray(attachment.attachments) && + attachment.attachments[0]?.image_url + ) { return ( - + ); + } + if ( + attachment.attachments && + Array.isArray(attachment.attachments) && + attachment.attachments[0]?.audio_url + ) { + return ( + + ); + } + if ( + attachment.attachments && + Array.isArray(attachment.attachments) && + attachment.attachments[0]?.video_url + ) { + return ( + ); } return ( - - {attachment?.description} - - - {attachment.title} - + ); }; diff --git a/packages/react/src/views/AttachmentHandler/AttachmentMetadata.js b/packages/react/src/views/AttachmentHandler/AttachmentMetadata.js index f4a45ca9e6..a3a4076f36 100644 --- a/packages/react/src/views/AttachmentHandler/AttachmentMetadata.js +++ b/packages/react/src/views/AttachmentHandler/AttachmentMetadata.js @@ -1,17 +1,24 @@ import React from 'react'; import { css } from '@emotion/react'; -import { ActionButton, Box } from '@embeddedchat/ui-elements'; +import { ActionButton, Box, Tooltip } from '@embeddedchat/ui-elements'; +import { Markdown } from '../Markdown'; -const AttachmentMetadata = ({ attachment, url, variantStyles = {} }) => { +const AttachmentMetadata = ({ + attachment, + url, + variantStyles = {}, + msg, + onExpandCollapseClick, + isExpanded, +}) => { const handleDownload = async () => { try { const response = await fetch(url); const data = await response.blob(); const downloadUrl = URL.createObjectURL(data); - const anchor = document.createElement('a'); anchor.href = downloadUrl; - anchor.download = attachment.title || 'download'; + anchor.download = attachment?.title || 'download'; document.body.appendChild(anchor); anchor.click(); @@ -22,51 +29,138 @@ const AttachmentMetadata = ({ attachment, url, variantStyles = {} }) => { } }; + const getFormattedFileSize = () => { + let sizeInBytes; + + if (attachment?.image_type && attachment?.image_size) { + sizeInBytes = attachment.image_size; + } else if (attachment?.video_type && attachment?.video_size) { + sizeInBytes = attachment.video_size; + } else if (attachment?.audio_type && attachment?.audio_size) { + sizeInBytes = attachment.audio_size; + } else if (attachment?.size) { + sizeInBytes = attachment.size; + } else { + return null; + } + + const sizeInKB = (sizeInBytes / 1024).toFixed(2); + return `${sizeInKB} kB`; + }; + + const fileSize = getFormattedFileSize(); + return ( -

- {attachment.description} -

+ {attachment?.description && ( +
+ {msg ? ( + + ) : ( + attachment?.description + )} +
+ )} + -

- {attachment.title} -

- +

+ {attachment?.title?.length > 22 + ? `${attachment.title.substring(0, 22)}...` + : attachment?.title} +

+ + {fileSize && ( + + ({fileSize}) + + )} +
+ + + > + + + + + + +
); diff --git a/packages/react/src/views/AttachmentHandler/Attachments.js b/packages/react/src/views/AttachmentHandler/Attachments.js index 35010476a4..f558ad5ec0 100644 --- a/packages/react/src/views/AttachmentHandler/Attachments.js +++ b/packages/react/src/views/AttachmentHandler/Attachments.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import Attachment from './Attachment'; import RCContext from '../../context/RCInstance'; -const Attachments = ({ attachments, type, variantStyles = {} }) => { +const Attachments = ({ attachments, type, variantStyles = {}, msg }) => { const { RCInstance } = useContext(RCContext); let host = RCInstance.getHost(); host = host.replace(/\/$/, ''); @@ -15,6 +15,7 @@ const Attachments = ({ attachments, type, variantStyles = {} }) => { host={host} variantStyles={variantStyles} type={type} + msg={msg} /> )); }; diff --git a/packages/react/src/views/AttachmentHandler/AudioAttachment.js b/packages/react/src/views/AttachmentHandler/AudioAttachment.js index ce84815828..867792b4f7 100644 --- a/packages/react/src/views/AttachmentHandler/AudioAttachment.js +++ b/packages/react/src/views/AttachmentHandler/AudioAttachment.js @@ -1,18 +1,159 @@ -import React from 'react'; +import React, { useState, useContext } from 'react'; import PropTypes from 'prop-types'; -import { Box } from '@embeddedchat/ui-elements'; +import { css } from '@emotion/react'; +import { Box, Avatar, useTheme } from '@embeddedchat/ui-elements'; import AttachmentMetadata from './AttachmentMetadata'; +import RCContext from '../../context/RCInstance'; -const AudioAttachment = ({ attachment, host, variantStyles }) => ( - - - -); +const AudioAttachment = ({ + attachment, + host, + type, + author, + variantStyles, + msg, +}) => { + const { RCInstance } = useContext(RCContext); + const { theme } = useTheme(); + const getUserAvatarUrl = (icon) => { + const instanceHost = RCInstance.getHost(); + const URL = `${instanceHost}${icon}`; + return URL; + }; + const { authorIcon, authorName } = author; + + const [isExpanded, setIsExpanded] = useState(true); + const toggleExpanded = () => { + setIsExpanded((prevState) => !prevState); + }; + + return ( + + + {type === 'file' ? ( + <> + + + @{authorName} + + + ) : ( + '' + )} + + + + {isExpanded && ( + + + ); +}; export default AudioAttachment; diff --git a/packages/react/src/views/AttachmentHandler/ImageAttachment.js b/packages/react/src/views/AttachmentHandler/ImageAttachment.js index 8937782569..84516ce65a 100644 --- a/packages/react/src/views/AttachmentHandler/ImageAttachment.js +++ b/packages/react/src/views/AttachmentHandler/ImageAttachment.js @@ -1,41 +1,182 @@ -import React, { useState } from 'react'; +import React, { useState, useContext } from 'react'; import { css } from '@emotion/react'; import PropTypes from 'prop-types'; -import { Box } from '@embeddedchat/ui-elements'; +import { Box, Avatar, useTheme } from '@embeddedchat/ui-elements'; import AttachmentMetadata from './AttachmentMetadata'; import ImageGallery from '../ImageGallery/ImageGallery'; +import RCContext from '../../context/RCInstance'; -const ImageAttachment = ({ attachment, host, variantStyles = {} }) => { +const ImageAttachment = ({ + attachment, + host, + type, + author, + variantStyles = {}, + msg, +}) => { + const { RCInstance } = useContext(RCContext); const [showGallery, setShowGallery] = useState(false); + const getUserAvatarUrl = (icon) => { + const instanceHost = RCInstance.getHost(); + const URL = `${instanceHost}${icon}`; + return URL; + }; const extractIdFromUrl = (url) => { const match = url.match(/\/file-upload\/(.*?)\//); return match ? match[1] : null; }; + const { theme } = useTheme(); + + const { authorIcon, authorName } = author; + + const [isExpanded, setIsExpanded] = useState(true); + const toggleExpanded = () => { + setIsExpanded((prevState) => !prevState); + }; + return ( - setShowGallery(true)} - css={css` - cursor: pointer; - border-radius: inherit; - line-height: 0; - `} + css={[ + css` + cursor: pointer; + border-radius: inherit; + line-height: 0; + padding: 0.5rem; + `, + (type ? variantStyles.pinnedContainer : '') || + css` + ${type === 'file' + ? `border: 2px solid ${theme.colors.border};` + : ''} + `, + ]} > - + {type === 'file' ? ( + <> + + + @{authorName} + + + ) : ( + '' + )} + + + + {isExpanded && ( + setShowGallery(true)}> + + + )} + {attachment.attachments && + attachment.attachments.map((nestedAttachment, index) => ( + + setShowGallery(true)} + css={[ + css` + cursor: pointer; + border-radius: inherit; + line-height: 0; + padding: 0.5rem; + `, + (nestedAttachment.attachments[0].type + ? variantStyles.pinnedContainer + : variantStyles.quoteContainer) || + css` + ${nestedAttachment.attachments[0].type === 'file' + ? `border: 2px solid ${theme.colors.border};` + : ''} + `, + ]} + > + {nestedAttachment.type === 'file' ? ( + <> + + + @{nestedAttachment.author_name} + + + ) : ( + '' + )} + + + + {showGallery && ( + + )} + + ))} {showGallery && ( { +const FileAttachment = ({ + attachment, + host, + type, + variantStyles = {}, + msg, +}) => { const { RCInstance } = useContext(RCContext); - const getUserAvatarUrl = (authorIcon) => { - const host = RCInstance.getHost(); - const URL = `${host}${authorIcon}`; - return URL; + const { theme, mode } = useTheme(); + const [isExpanded, setIsExpanded] = useState(true); + + const getUserAvatarUrl = (icon) => { + const instanceHost = RCInstance.getHost(); + return `${instanceHost}${icon}`; + }; + + const toggleExpanded = () => { + setIsExpanded((prevState) => !prevState); + }; + + const getMessageIdFromAttachment = (quoteAttachment) => { + const link = quoteAttachment?.title_link || quoteAttachment?.message_link; + if (!link) return null; + + try { + const query = link.includes('?') ? link.split('?')[1] : ''; + const params = new URLSearchParams(query); + return params.get('msg'); + } catch { + return null; + } + }; + + const handleQuoteClick = (quoteAttachment) => { + const msgId = getMessageIdFromAttachment(quoteAttachment); + if (!msgId) return; + + const element = document.getElementById(`ec-message-body-${msgId}`); + if (!element) return; + + const container = element.closest('.ec-message'); + if (!container) return; + + container.scrollIntoView({ behavior: 'smooth', block: 'center' }); + + const highlightColor = + mode === 'light' ? theme.colors.warningForeground : theme.colors.warning; + + container.style.transition = 'background-color 1s ease-out'; + container.style.backgroundColor = highlightColor; + + setTimeout(() => { + container.style.backgroundColor = ''; + }, 2000); }; - let attachmentText = attachment?.text; - if (attachmentText.includes(')')) { - attachmentText = attachmentText.split(')')[1] || ''; - } + const getTimeString = (ts) => { + if (!ts) return null; + if (typeof ts === 'object' && ts.$date) { + ts = ts.$date; + } + const date = new Date(ts); + return !Number.isNaN(date.getTime()) ? format(date, 'h:mm a') : ts; + }; + + const formatFileSize = (bytes) => { + if (!bytes || bytes === 0) return '0 B'; + + const units = ['B', 'KB', 'MB', 'GB']; + const k = 1024; + + const i = Math.floor(Math.log(bytes) / Math.log(k)); - const { theme } = useTheme(); + const unitIndex = Math.min(i, units.length - 1); + + const size = bytes / k ** unitIndex; + const decimals = unitIndex === 0 ? 0 : unitIndex === 1 ? 1 : 2; + + return `${size.toFixed(decimals)} ${units[unitIndex]}`; + }; + + const getFileSizeWithFormat = (size, fileFormat) => { + const formattedSize = formatFileSize(size); + return fileFormat ? `${formattedSize} - ${fileFormat}` : formattedSize; + }; return ( - + {attachment?.author_name && ( - <> + @{attachment?.author_name} - + {getTimeString(attachment?.ts) && ( + handleQuoteClick(attachment)} + css={css` + font-size: 0.75rem; + color: ${theme.colors.mutedForeground}; + cursor: pointer; + &:hover { + text-decoration: underline; + } + `} + > + {getTimeString(attachment.ts)} + + )} + )} - - - {attachmentText} + + {!attachment?.text && !attachment?.attachments && ( + + )} + {isExpanded && (attachment?.title_link || attachment?.text) && ( + + {attachment?.text ? ( + attachment.text[0] === '[' ? ( + attachment.text.match(/\n(.*)/)?.[1] || '' + ) : ( + + ) + ) : !attachment.attachments ? ( + + + + + {attachment.title} + + + {getFileSizeWithFormat(attachment.size, attachment.format)} + + + + ) : ( + '' + )} + + )} + {attachment?.attachments && + Array.isArray(attachment.attachments) && + attachment.attachments.map((nestedAttachment, index) => { + if (nestedAttachment?.audio_url) { + return ( + + ); + } + if (nestedAttachment?.video_url) { + return ( + + ); + } + if (nestedAttachment?.image_url) { + return ( + + ); + } + // Check for wrapped attachments (mirroring Attachment.js logic) + if (nestedAttachment?.attachments?.[0]?.audio_url) { + return ( + + ); + } + if (nestedAttachment?.attachments?.[0]?.video_url) { + return ( + + ); + } + if (nestedAttachment?.attachments?.[0]?.image_url) { + return ( + + ); + } + + return ( + + + {nestedAttachment?.author_name && ( + <> + + @{nestedAttachment?.author_name} + {getTimeString(nestedAttachment?.ts) && ( + handleQuoteClick(nestedAttachment)} + css={css` + font-size: 0.75rem; + color: ${theme.colors.mutedForeground}; + cursor: pointer; + &:hover { + text-decoration: underline; + } + `} + > + {getTimeString(nestedAttachment.ts)} + + )} + + )} + + + {!nestedAttachment?.text && !nestedAttachment?.attachments && ( + + )} + + {isExpanded && ( + + {nestedAttachment?.text ? ( + nestedAttachment.text[0] === '[' ? ( + nestedAttachment.text.match(/\n(.*)/)?.[1] || '' + ) : ( + + ) + ) : ( + + + + + {nestedAttachment?.title} + + + {getFileSizeWithFormat( + nestedAttachment?.size, + nestedAttachment?.format + )} + + + + )} + + )} + + ); + })} ); }; -export default TextAttachment; +export default FileAttachment; -TextAttachment.propTypes = { +FileAttachment.propTypes = { attachment: PropTypes.object, + host: PropTypes.string, + type: PropTypes.string, + variantStyles: PropTypes.object, + msg: PropTypes.object, }; diff --git a/packages/react/src/views/AttachmentHandler/VideoAttachment.js b/packages/react/src/views/AttachmentHandler/VideoAttachment.js index 0472d34c21..7bad3a90c6 100644 --- a/packages/react/src/views/AttachmentHandler/VideoAttachment.js +++ b/packages/react/src/views/AttachmentHandler/VideoAttachment.js @@ -1,8 +1,9 @@ -import React from 'react'; +import React, { useState, useContext } from 'react'; import PropTypes from 'prop-types'; import { css } from '@emotion/react'; -import { Box } from '@embeddedchat/ui-elements'; +import { Box, Avatar, useTheme } from '@embeddedchat/ui-elements'; import AttachmentMetadata from './AttachmentMetadata'; +import RCContext from '../../context/RCInstance'; const userAgentMIMETypeFallback = (type) => { const userAgent = navigator.userAgent.toLocaleLowerCase(); @@ -14,35 +15,195 @@ const userAgentMIMETypeFallback = (type) => { return type; }; -const VideoAttachment = ({ attachment, host, variantStyles = {} }) => ( - - - - + {type === 'file' ? ( + <> + + + + @{authorName} + + + + ) : ( + '' + )} + + + + {isExpanded && ( + + )} + {attachment.attachments && + attachment.attachments.map((nestedAttachment, index) => ( + + + {nestedAttachment.type === 'file' ? ( + <> + + + @{authorName} + + + ) : ( + '' + )} + + + + + ))} + - -); + ); +}; export default VideoAttachment; diff --git a/packages/react/src/views/AttachmentPreview/AttachmentPreview.js b/packages/react/src/views/AttachmentPreview/AttachmentPreview.js index 236c3ec1ba..e6dadeae61 100644 --- a/packages/react/src/views/AttachmentPreview/AttachmentPreview.js +++ b/packages/react/src/views/AttachmentPreview/AttachmentPreview.js @@ -1,45 +1,99 @@ -import React, { useContext, useState } from 'react'; +import React, { useContext, useState, useRef, useEffect } from 'react'; import { css } from '@emotion/react'; -import { Box, Icon, Button, Input, Modal } from '@embeddedchat/ui-elements'; +import { + Box, + Icon, + Button, + Input, + Modal, + useTheme, +} from '@embeddedchat/ui-elements'; import useAttachmentWindowStore from '../../store/attachmentwindow'; import CheckPreviewType from './CheckPreviewType'; import RCContext from '../../context/RCInstance'; -import { useMessageStore } from '../../store'; +import { useMessageStore, useMemberStore } from '../../store'; +import useSettingsStore from '../../store/settingsStore'; import getAttachmentPreviewStyles from './AttachmentPreview.styles'; +import { parseEmoji } from '../../lib/emoji'; +import MembersList from '../Mentions/MembersList'; +import TypingUsers from '../TypingUsers/TypingUsers'; +import useSearchMentionUser from '../../hooks/useSearchMentionUser'; const AttachmentPreview = () => { const { RCInstance, ECOptions } = useContext(RCContext); + const { theme } = useTheme(); const styles = getAttachmentPreviewStyles(); const toggle = useAttachmentWindowStore((state) => state.toggle); const data = useAttachmentWindowStore((state) => state.data); const setData = useAttachmentWindowStore((state) => state.setData); + const [isPending, setIsPending] = useState(false); + const messageRef = useRef(null); + const [showMembersList, setShowMembersList] = useState(false); + const [filteredMembers, setFilteredMembers] = useState([]); + const [mentionIndex, setMentionIndex] = useState(-1); + const [startReadMentionUser, setStartReadMentionUser] = useState(false); + + const [fileName, setFileName] = useState(data?.name ?? ''); + useEffect(() => setFileName(data?.name ?? ''), [data?.name]); - const [fileName, setFileName] = useState(data?.name); - const [fileDescription, setFileDescription] = useState(''); + const [description, setDescription] = useState(''); + const charCount = description.length; + const msgMaxLength = useSettingsStore((s) => s?.messageLimit); + const isOverLimit = msgMaxLength && charCount > msgMaxLength; const threadId = useMessageStore((state) => state.threadMainMessage?._id); - const handleFileName = (e) => { - setFileName(e.target.value); - }; + const { members } = useMemberStore((state) => ({ members: state.members })); + + const searchMentionUser = useSearchMentionUser( + members, + startReadMentionUser, + setStartReadMentionUser, + setFilteredMembers, + setMentionIndex, + setShowMembersList + ); + + const handleFileName = (e) => setFileName(e.target.value); const handleFileDescription = (e) => { - setFileDescription(e.target.value); + const raw = e.target.value || ''; + setDescription(raw); + + if (messageRef.current && typeof messageRef.current.value !== 'undefined') { + messageRef.current.value = raw; + } + + searchMentionUser(raw); }; const submit = async () => { + if (isPending) return; + if (msgMaxLength && description.length > msgMaxLength) return; + setIsPending(true); - await RCInstance.sendAttachment( - data, - fileName, - fileDescription, - ECOptions?.enableThreads ? threadId : undefined - ); - toggle(); - setData(null); - setIsPending(false); + try { + await RCInstance.sendAttachment( + data, + fileName, + parseEmoji(description), + ECOptions?.enableThreads ? threadId : undefined + ); + toggle(); + setData(null); + } finally { + setIsPending(false); + } }; + + const onDescKeyDown = (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + submit(); + } + }; + return ( @@ -50,11 +104,12 @@ const AttachmentPreview = () => { css={css` margin-right: 0.5rem; `} - />{' '} + /> File Upload + { > + { File name { - handleFileName(e); - }} + onChange={handleFileName} value={fileName} + type="text" css={styles.input} placeholder="name" /> + @@ -100,14 +156,86 @@ const AttachmentPreview = () => { > File description - { - handleFileDescription(e); - }} - value={fileDescription} - css={styles.input} - placeholder="Description" - /> + + + + {showMembersList && ( + + )} + + + + + {msgMaxLength && ( + + + {isOverLimit + ? `Cannot upload file, description is over the ${msgMaxLength} character limit` + : ''} + + + + + )} + @@ -121,12 +249,8 @@ const AttachmentPreview = () => { - diff --git a/packages/react/src/views/AttachmentPreview/AttachmentPreview.styles.js b/packages/react/src/views/AttachmentPreview/AttachmentPreview.styles.js index 44729be847..45f8cf455a 100644 --- a/packages/react/src/views/AttachmentPreview/AttachmentPreview.styles.js +++ b/packages/react/src/views/AttachmentPreview/AttachmentPreview.styles.js @@ -11,7 +11,7 @@ const getAttachmentPreviewStyles = () => { `, input: css` - width: 95.5%; + width: 100%; `, modalContent: css` @@ -19,6 +19,22 @@ const getAttachmentPreviewStyles = () => { overflow-x: hidden; max-height: 350px; `, + + fileDescription: css` + width: 100%; + position: relative; + z-index: 1300; + `, + + mentionListContainer: css` + position: absolute; + top: -100px; + width: 100%; + max-height: 100px; + overflow-y: auto; + background: white; + z-index: 1400; + `, }; return styles; diff --git a/packages/react/src/views/AttachmentPreview/PreviewType/audio.js b/packages/react/src/views/AttachmentPreview/PreviewType/audio.js index da4bbe9fff..7dc902b32b 100644 --- a/packages/react/src/views/AttachmentPreview/PreviewType/audio.js +++ b/packages/react/src/views/AttachmentPreview/PreviewType/audio.js @@ -5,7 +5,7 @@ import { Box } from '@embeddedchat/ui-elements'; function PreviewAudio({ previewURL }) { return ( - ); } diff --git a/packages/react/src/views/AttachmentPreview/PreviewType/image.js b/packages/react/src/views/AttachmentPreview/PreviewType/image.js index 5c2d3b4d8a..60573d75af 100644 --- a/packages/react/src/views/AttachmentPreview/PreviewType/image.js +++ b/packages/react/src/views/AttachmentPreview/PreviewType/image.js @@ -7,7 +7,7 @@ function PreviewImage({ previewURL }) { return ( { const { classNames, styleOverrides } = useComponentOverrides('ChatBody'); - - const styles = getChatbodyStyles(); + const { theme, mode } = useTheme(); + const styles = getChatbodyStyles(theme, mode); const [scrollPosition, setScrollPosition] = useState(0); const [popupVisible, setPopupVisible] = useState(false); const [, setIsUserScrolledUp] = useState(false); const [otherUserMessage, setOtherUserMessage] = useState(false); - + const [isOverflowing, setIsOverflowing] = useState(false); + const [firstUnreadMessageId, setFirstUnreadMessageId] = useState(null); + const pendingFirstUnreadRef = useRef(null); const { RCInstance, ECOptions } = useContext(RCContext); + const showAnnouncement = ECOptions?.showAnnouncement; const messages = useMessageStore((state) => state.messages); + const offset = useMessageStore((state) => state.messagesOffset); + const setMessagesOffset = useMessageStore((state) => state.setMessagesOffset); const threadMessages = useMessageStore((state) => state.threadMessages); - + const [isModalOpen, setModalOpen] = useState(false); const setThreadMessages = useMessageStore((state) => state.setThreadMessages); const upsertMessage = useMessageStore((state) => state.upsertMessage); + const [loadingOlderMessages, setLoadingOlderMessages] = useState(false); + const [hasMoreMessages, setHasMoreMessages] = useState(true); const removeMessage = useMessageStore((state) => state.removeMessage); const isChannelPrivate = useChannelStore((state) => state.isChannelPrivate); + const channelInfo = useChannelStore((state) => state.channelInfo); const isLoginIn = useLoginStore((state) => state.isLoginIn); + const setMessages = useMessageStore((state) => state.setMessages); const [isThreadOpen, threadMainMessage] = useMessageStore((state) => [ state.isThreadOpen, @@ -67,9 +86,15 @@ const ChatBody = ({ (state) => state.isUserAuthenticated ); + const isUserAuthenticatedRef = useRef(isUserAuthenticated); + useEffect(() => { + isUserAuthenticatedRef.current = isUserAuthenticated; + }, [isUserAuthenticated]); + const username = useUserStore((state) => state.username); - const getMessagesAndRoles = useFetchChatData(showRoles); + const { getMessagesAndRoles, fetchAndSetPermissions, permissionsRef } = + useFetchChatData(showRoles); const getThreadMessages = useCallback(async () => { if (isUserAuthenticated && threadMainMessage?._id) { @@ -81,7 +106,7 @@ const ChatBody = ({ threadMainMessage._id, isChannelPrivate ); - setThreadMessages(messages); + setThreadMessages(messages.reverse()); } catch (e) { console.error(e); } @@ -107,6 +132,10 @@ const ChatBody = ({ const isScrolledUp = messageListRef?.current?.scrollTop !== 0; if (isScrolledUp && !('pinned' in message) && !('starred' in message)) { setOtherUserMessage(true); + // Track the first unread message (only set if not already tracking) + if (!pendingFirstUnreadRef.current) { + pendingFirstUnreadRef.current = message._id; + } } } upsertMessage(message, ECOptions?.enableThreads); @@ -122,14 +151,12 @@ const ChatBody = ({ ); useEffect(() => { - RCInstance.auth.onAuthChange((user) => { - if (user) { - RCInstance.addMessageListener(addMessage); - RCInstance.addMessageDeleteListener(removeMessage); - RCInstance.addActionTriggeredListener(onActionTriggerResponse); - RCInstance.addUiInteractionListener(onActionTriggerResponse); - } - }); + if (isUserAuthenticated) { + RCInstance.addMessageListener(addMessage); + RCInstance.addMessageDeleteListener(removeMessage); + RCInstance.addActionTriggeredListener(onActionTriggerResponse); + RCInstance.addUiInteractionListener(onActionTriggerResponse); + } return () => { RCInstance.removeMessageListener(addMessage); @@ -137,32 +164,96 @@ const ChatBody = ({ RCInstance.removeActionTriggeredListener(onActionTriggerResponse); RCInstance.removeUiInteractionListener(onActionTriggerResponse); }; - }, [RCInstance, addMessage, removeMessage, onActionTriggerResponse]); + }, [ + RCInstance, + isUserAuthenticated, + addMessage, + removeMessage, + onActionTriggerResponse, + ]); useEffect(() => { - RCInstance.auth.onAuthChange((user) => { - if (user) { - getMessagesAndRoles(); - } else { - getMessagesAndRoles(anonymousMode); - } - }); - }, [RCInstance, anonymousMode, getMessagesAndRoles]); + if (isUserAuthenticated) { + getMessagesAndRoles(); + setHasMoreMessages(true); + } else { + getMessagesAndRoles(anonymousMode); + } + }, [RCInstance, isUserAuthenticated, anonymousMode, getMessagesAndRoles]); + + useEffect(() => { + if (isUserAuthenticated) { + fetchAndSetPermissions(); + } else { + permissionsRef.current = null; + } + }, [isUserAuthenticated, fetchAndSetPermissions, permissionsRef]); + + // Expose clearUnreadDivider function via ref for ChatInput to call + useEffect(() => { + if (clearUnreadDividerRef) { + clearUnreadDividerRef.current = () => { + setFirstUnreadMessageId(null); + pendingFirstUnreadRef.current = null; + }; + } + }, [clearUnreadDividerRef]); const handlePopupClick = () => { + // Set the unread divider to show above the first unread message + if (pendingFirstUnreadRef.current) { + setFirstUnreadMessageId(pendingFirstUnreadRef.current); + pendingFirstUnreadRef.current = null; + } scrollToBottom(); setIsUserScrolledUp(false); setOtherUserMessage(false); setPopupVisible(false); }; - const handleScroll = useCallback(() => { + const handleScroll = useCallback(async () => { if (messageListRef && messageListRef.current) { setScrollPosition(messageListRef.current.scrollTop); setIsUserScrolledUp( messageListRef.current.scrollTop + messageListRef.current.clientHeight < messageListRef.current.scrollHeight ); + + if ( + messageListRef.current.scrollTop === 0 && + !loadingOlderMessages && + hasMoreMessages && + (isUserAuthenticatedRef.current || anonymousMode) + ) { + setLoadingOlderMessages(true); + + try { + const olderMessages = await RCInstance.getOlderMessages( + anonymousMode, + { offset }, + anonymousMode ? false : isChannelPrivate + ); + const messageList = messageListRef.current; + if (olderMessages?.messages?.length) { + const previousScrollHeight = messageList.scrollHeight; + + setMessages(olderMessages.messages, true); + setMessagesOffset(offset + olderMessages.messages.length); + + requestAnimationFrame(() => { + const newScrollHeight = messageList.scrollHeight; + messageList.scrollTop = newScrollHeight - previousScrollHeight; + }); + } else { + setHasMoreMessages(false); + } + } catch (error) { + console.error('Error fetching older messages:', error); + setHasMoreMessages(false); + } finally { + setLoadingOlderMessages(false); + } + } } const isAtBottom = messageListRef?.current?.scrollTop === 0; @@ -170,19 +261,57 @@ const ChatBody = ({ setPopupVisible(false); setIsUserScrolledUp(false); setOtherUserMessage(false); + // Clear unread divider when scrolled to bottom + if (firstUnreadMessageId) { + setFirstUnreadMessageId(null); + } + // Also clear pending unread ref + pendingFirstUnreadRef.current = null; } }, [ messageListRef, + offset, + setMessagesOffset, + setMessages, + anonymousMode, + hasMoreMessages, + RCInstance, + isChannelPrivate, + loadingOlderMessages, setScrollPosition, setIsUserScrolledUp, setPopupVisible, setOtherUserMessage, + firstUnreadMessageId, ]); const showNewMessagesPopup = () => { setPopupVisible(true); }; + const announcementRef = useRef(null); + + const toggleModal = () => { + setModalOpen(!isModalOpen); + }; + + const checkOverflow = () => { + if (announcementRef.current) { + setIsOverflowing( + announcementRef.current.scrollWidth > + announcementRef.current.clientWidth + ); + } + }; + + useEffect(() => { + if (messageListRef.current) { + messageListRef.current.scrollTop = messageListRef.current.scrollHeight; + } + }, [messages]); + useEffect(() => { + checkOverflow(); + }, [channelInfo.announcement, showAnnouncement]); useEffect(() => { const currentRef = messageListRef.current; currentRef.addEventListener('scroll', handleScroll); @@ -204,6 +333,62 @@ const ChatBody = ({ return ( <> + {channelInfo.announcement && showAnnouncement && ( + + + {channelInfo.announcement} + + + )} + {isModalOpen && ( + + + + Announcement + + + + + {channelInfo.announcement} + + + + + + )} ) : ( - + )} diff --git a/packages/react/src/views/ChatBody/ChatBody.styles.js b/packages/react/src/views/ChatBody/ChatBody.styles.js index 36fc549b5f..20deecd1f5 100644 --- a/packages/react/src/views/ChatBody/ChatBody.styles.js +++ b/packages/react/src/views/ChatBody/ChatBody.styles.js @@ -1,6 +1,7 @@ import { css } from '@emotion/react'; +import { darken, lighten } from '@embeddedchat/ui-elements'; -export const getChatbodyStyles = () => { +export const getChatbodyStyles = (theme, mode) => { const styles = { chatbodyContainer: css` flex: 1; @@ -8,12 +9,29 @@ export const getChatbodyStyles = () => { overflow: auto; overflow-x: hidden; display: flex; - flex-direction: column-reverse; - max-height: 600px; + flex-direction: column; + max-height: 100%; position: relative; padding-top: 70px; margin-top: 0.25rem; `, + announcementStyles: css` + display: flex; + justify-content: center; + padding: 7px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background-color: ${mode === 'light' + ? lighten(theme.colors.info, 0.78) + : darken(theme.colors.primary, 0.7)}; + `, + announcementTextBox: css` + max-width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `, }; return styles; diff --git a/packages/react/src/views/ChatHeader/ChatHeader.js b/packages/react/src/views/ChatHeader/ChatHeader.js index d9b6b8461b..c28e9ad39e 100644 --- a/packages/react/src/views/ChatHeader/ChatHeader.js +++ b/packages/react/src/views/ChatHeader/ChatHeader.js @@ -1,4 +1,5 @@ import React, { useCallback, useEffect, useMemo } from 'react'; +import { css } from '@emotion/react'; import PropTypes from 'prop-types'; import { Box, @@ -8,6 +9,7 @@ import { useToastBarDispatch, useComponentOverrides, useTheme, + Avatar, } from '@embeddedchat/ui-elements'; import { useRCContext } from '../../context/RCInstance'; import { @@ -21,6 +23,7 @@ import { usePinnedMessageStore, useStarredMessageStore, useFileStore, + useSidebarStore, } from '../../store'; import { DynamicHeader } from '../DynamicHeader'; import useFetchChatData from '../../hooks/useFetchChatData'; @@ -70,6 +73,11 @@ const ChatHeader = ({ const setIsChannelPrivate = useChannelStore( (state) => state.setIsChannelPrivate ); + const setIsChannelArchived = useChannelStore( + (state) => state.setIsChannelArchived + ); + const isRoomTeam = useChannelStore((state) => state.isRoomTeam); + const setIsRoomTeam = useChannelStore((state) => state.setIsRoomTeam); const setIsChannelReadOnly = useChannelStore( (state) => state.setIsChannelReadOnly ); @@ -84,17 +92,20 @@ const ChatHeader = ({ const setIsUserAuthenticated = useUserStore( (state) => state.setIsUserAuthenticated ); - + const setShowSidebar = useSidebarStore((state) => state.setShowSidebar); const dispatchToastMessage = useToastBarDispatch(); - const getMessagesAndRoles = useFetchChatData(showRoles); + const { getMessagesAndRoles } = useFetchChatData(showRoles); const setMessageLimit = useSettingsStore((state) => state.setMessageLimit); - + const setMessages = useMessageStore((state) => state.setMessages); const avatarUrl = useUserStore((state) => state.avatarUrl); + const setUserAvatarUrl = useUserStore((state) => state.setUserAvatarUrl); const headerTitle = useMessageStore((state) => state.headerTitle); const filtered = useMessageStore((state) => state.filtered); const setFilter = useMessageStore((state) => state.setFilter); - const threadTitle = useMessageStore((state) => state.threadMainMessage?.msg); + const isThreadOpen = useMessageStore((state) => state.isThreadOpen); + const threadMainMessage = useMessageStore((state) => state.threadMainMessage); + const closeThread = useMessageStore((state) => state.closeThread); const setShowMembers = useMemberStore((state) => state.setShowMembers); @@ -108,7 +119,10 @@ const ChatHeader = ({ ); const setShowAllFiles = useFileStore((state) => state.setShowAllFiles); const setShowMentions = useMentionsStore((state) => state.setShowMentions); - + const getChannelAvatarURL = (channelname) => { + const host = RCInstance.getHost(); + return `${host}/avatar/${channelname}`; + }; const handleGoBack = async () => { if (isUserAuthenticated) { getMessagesAndRoles(); @@ -119,10 +133,14 @@ const ChatHeader = ({ }; const setCanSendMsg = useUserStore((state) => state.setCanSendMsg); const authenticatedUserId = useUserStore((state) => state.userId); - const handleLogout = useCallback(async () => { try { await RCInstance.logout(); + setMessages([]); + setChannelInfo({}); + setShowSidebar(false); + setUserAvatarUrl(null); + useMessageStore.setState({ isMessageLoaded: false }); } catch (e) { console.error(e); } finally { @@ -132,8 +150,13 @@ const ChatHeader = ({ useEffect(() => { const getMessageLimit = async () => { - const messageLimitObj = await RCInstance.getMessageLimit(); - setMessageLimit(messageLimitObj?.value); + try { + const messageLimitObj = await RCInstance.getMessageLimit(); + setMessageLimit(messageLimitObj?.value); + } catch (e) { + console.error('Failed to fetch message limit', e); + setMessageLimit(undefined); + } }; const setMessageAllowed = async () => { @@ -160,6 +183,7 @@ const ChatHeader = ({ if (res.success) { setChannelInfo(res.room); if (res.room.t === 'p') setIsChannelPrivate(true); + if (res.room?.teamMain) setIsRoomTeam(true); if (res.room.ro) { setIsChannelReadOnly(true); setMessageAllowed(); @@ -173,6 +197,14 @@ const ChatHeader = ({ message: "Channel doesn't exist. Logging out.", }); await RCInstance.logout(); + } else if ( + 'errorType' in res && + res.errorType === 'error-room-archived' + ) { + setIsChannelArchived(true); + const roomInfo = await RCInstance.getRoomInfo(); + const roomData = roomInfo.result[roomInfo.result.length - 1]; + setChannelInfo(roomData); } else if ('errorType' in res && res.errorType === 'Not Allowed') { dispatchToastMessage({ type: 'error', @@ -336,7 +368,6 @@ const ChatHeader = ({ > - {isUserAuthenticated ? ( <> @@ -344,17 +375,53 @@ const ChatHeader = ({ level={3} className="ec-chat-header--channelName" css={styles.clearSpacing} + style={{ + display: 'flex', + alignItems: 'center', + gap: '0.2rem', + }} > - {channelInfo.name || channelName || 'channelName'} + + + setExclusiveState(setShowChannelinfo)} + > + +
+ {channelInfo.name || channelName || 'channelName'} +
+
+ {fullScreen && ( + + {channelInfo.topic || ''} + + )} +
- {fullScreen && ( -

- {channelInfo.description || ''} -

- )} ) : ( {avatarUrl && ( - avatar + avatar )} {surfaceOptions.length > 0 && ( @@ -380,7 +452,7 @@ const ChatHeader = ({ {isThreadOpen && ( diff --git a/packages/react/src/views/ChatHeader/ChatHeader.styles.js b/packages/react/src/views/ChatHeader/ChatHeader.styles.js index 676d677090..5ae8b52647 100644 --- a/packages/react/src/views/ChatHeader/ChatHeader.styles.js +++ b/packages/react/src/views/ChatHeader/ChatHeader.styles.js @@ -13,12 +13,13 @@ const getChatHeaderStyles = ({ theme, mode }) => { margin: 0; padding: 0; `, - chatHeaderChild: css` ${rowCentreAlign} padding: 0 0.75rem; justify-content: space-between; width: 100%; + flex-wrap: wrap; + gap: 0.5rem; `, chatHeaderParent: css` @@ -33,15 +34,50 @@ const getChatHeaderStyles = ({ theme, mode }) => { box-shadow: ${theme.shadows[1]}; `, + channelInfoContainer: css` + display: flex; + flex-direction: column; + min-width: 0; + flex: 1; + `, + channelDescription: css` ${rowCentreAlign} + flex: 1; + min-width: 120px; gap: 0.5rem; + overflow: hidden; `, chatHeaderIconRow: css` ${rowCentreAlign} - position:relative; + position: relative; gap: 0.5rem; + flex-shrink: 0; + @media (max-width: 380px) { + gap: 0.25rem; + flex-wrap: wrap; + justify-content: flex-end; + } + `, + channelName: css` + display: flex; + align-items: center; + gap: 0.1rem; + cursor: pointer; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `, + channelTopic: css` + opacity: 0.8rem; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + word-break: break-word; + overflow: hidden; + font-size: 1rem; + text-overflow: ellipsis; `, }; return styles; diff --git a/packages/react/src/views/ChatInput/AudioMessageRecorder.js b/packages/react/src/views/ChatInput/AudioMessageRecorder.js index caef86e700..35e8063a52 100644 --- a/packages/react/src/views/ChatInput/AudioMessageRecorder.js +++ b/packages/react/src/views/ChatInput/AudioMessageRecorder.js @@ -1,17 +1,18 @@ -import React, { - useState, - useEffect, - useCallback, - useContext, - useRef, -} from 'react'; -import { Box, Icon, ActionButton, useTheme } from '@embeddedchat/ui-elements'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; +import { + Box, + Icon, + ActionButton, + Tooltip, + useTheme, +} from '@embeddedchat/ui-elements'; import { useMediaRecorder } from '../../hooks/useMediaRecorder'; -import RCContext from '../../context/RCInstance'; import useMessageStore from '../../store/messageStore'; import { getCommonRecorderStyles } from './ChatInput.styles'; +import useAttachmentWindowStore from '../../store/attachmentwindow'; -const AudioMessageRecorder = () => { +const AudioMessageRecorder = (props) => { + const { disabled, displayName, popOverItemStyles } = props; const videoRef = useRef(null); const { theme } = useTheme(); const styles = getCommonRecorderStyles(theme); @@ -19,13 +20,17 @@ const AudioMessageRecorder = () => { (state) => state.toogleRecordingMessage ); - const { RCInstance, ECOptions } = useContext(RCContext); + const { toggle, setData } = useAttachmentWindowStore((state) => ({ + toggle: state.toggle, + setData: state.setData, + })); + const [state, setRecordState] = useState('idle'); const [time, setTime] = useState('00:00'); const [recordingInterval, setRecordingInterval] = useState(null); const [file, setFile] = useState(null); const [isRecorded, setIsRecorded] = useState(false); - const threadId = useMessageStore((_state) => _state.threadMainMessage?._id); + const onStop = (audioChunks) => { const audioBlob = new Blob(audioChunks, { type: 'audio/mpeg' }); const fileName = 'Audio record.mp3'; @@ -49,6 +54,7 @@ const AudioMessageRecorder = () => { }; const handleRecordButtonClick = () => { + if (disabled) return; setRecordState('recording'); try { start(); @@ -113,23 +119,16 @@ const AudioMessageRecorder = () => { } catch (error) { console.warn(error); } - }); + }, []); useEffect(() => { handleMount(); }, [handleMount]); useEffect(() => { - const sendRecording = async () => { - await RCInstance.sendAttachment( - file, - undefined, - undefined, - ECOptions.enableThreads ? threadId : undefined - ); - }; if (isRecorded && file) { - sendRecording(); + toggle(); + setData(file); setIsRecorded(false); } if (file) { @@ -138,10 +137,27 @@ const AudioMessageRecorder = () => { }, [isRecorded, file]); if (state === 'idle') { - return ( - - - + return displayName ? ( + + + {displayName} + + ) : ( + + + + + ); } @@ -149,18 +165,22 @@ const AudioMessageRecorder = () => { {state === 'recording' && ( <> - - - + + + + + {time} - - - + + + + + )} diff --git a/packages/react/src/views/ChatInput/ChatInput.js b/packages/react/src/views/ChatInput/ChatInput.js index 99c1c8b4f7..0a8d0d7cd8 100644 --- a/packages/react/src/views/ChatInput/ChatInput.js +++ b/packages/react/src/views/ChatInput/ChatInput.js @@ -25,17 +25,20 @@ import useAttachmentWindowStore from '../../store/attachmentwindow'; import MembersList from '../Mentions/MembersList'; import { TypingUsers } from '../TypingUsers'; import createPendingMessage from '../../lib/createPendingMessage'; -import { parseEmoji } from '../../lib/emoji'; import { CommandsList } from '../CommandList'; +import { EmojiList } from '../EmojiList'; import useSettingsStore from '../../store/settingsStore'; import ChannelState from '../ChannelState/ChannelState'; import QuoteMessage from '../QuoteMessage/QuoteMessage'; import { getChatInputStyles } from './ChatInput.styles'; import useShowCommands from '../../hooks/useShowCommands'; import useSearchMentionUser from '../../hooks/useSearchMentionUser'; +import useSearchEmoji from '../../hooks/useSearchEmoji'; import formatSelection from '../../lib/formatSelection'; +import { parseEmoji } from '../../lib/emoji'; +import useDropBox from '../../hooks/useDropBox'; -const ChatInput = ({ scrollToBottom }) => { +const ChatInput = ({ scrollToBottom, clearUnreadDividerRef }) => { const { styleOverrides, classNames } = useComponentOverrides('ChatInput'); const { RCInstance, ECOptions } = useRCContext(); const { theme } = useTheme(); @@ -56,6 +59,10 @@ const ChatInput = ({ scrollToBottom }) => { const [showMembersList, setShowMembersList] = useState(false); const [showCommandList, setShowCommandList] = useState(false); const [filteredCommands, setFilteredCommands] = useState([]); + const [showEmojiList, setShowEmojiList] = useState(false); + const [filteredEmojis, setFilteredEmojis] = useState([]); + const [emojiIndex, setEmojiIndex] = useState(-1); + const [startReadEmoji, setStartReadEmoji] = useState(false); const [isMsgLong, setIsMsgLong] = useState(false); const { @@ -74,9 +81,16 @@ const ChatInput = ({ scrollToBottom }) => { name: state.name, })); - const { isChannelPrivate, isChannelReadOnly } = useChannelStore((state) => ({ + const { + isChannelPrivate, + isChannelReadOnly, + channelInfo, + isChannelArchived, + } = useChannelStore((state) => ({ isChannelPrivate: state.isChannelPrivate, isChannelReadOnly: state.isChannelReadOnly, + channelInfo: state.channelInfo, + isChannelArchived: state.isChannelArchived, })); const { members, setMembersHandler } = useMemberStore((state) => ({ @@ -90,20 +104,24 @@ const ChatInput = ({ scrollToBottom }) => { editMessage, setEditMessage, quoteMessage, - setQuoteMessage, isRecordingMessage, upsertMessage, replaceMessage, + removeMessage, + clearQuoteMessages, threadId, + deletedMessage, } = useMessageStore((state) => ({ editMessage: state.editMessage, setEditMessage: state.setEditMessage, quoteMessage: state.quoteMessage, - setQuoteMessage: state.setQuoteMessage, isRecordingMessage: state.isRecordingMessage, upsertMessage: state.upsertMessage, replaceMessage: state.replaceMessage, threadId: state.threadMainMessage?._id, + clearQuoteMessages: state.clearQuoteMessages, + removeMessage: state.removeMessage, + deletedMessage: state.deletedMessage, })); const setIsLoginModalOpen = useLoginStore( @@ -111,9 +129,10 @@ const ChatInput = ({ scrollToBottom }) => { ); const isLoginIn = useLoginStore((state) => state.isLoginIn); - const { toggle, setData } = useAttachmentWindowStore((state) => ({ + const { toggle, setData, data } = useAttachmentWindowStore((state) => ({ toggle: state.toggle, setData: state.setData, + data: state.data, })); const userInfo = { _id: userId, username, name }; @@ -134,33 +153,57 @@ const ChatInput = ({ scrollToBottom }) => { setShowMembersList ); + const { handlePaste } = useDropBox(); + const searchEmoji = useSearchEmoji( + startReadEmoji, + setStartReadEmoji, + setFilteredEmojis, + setEmojiIndex, + setShowEmojiList + ); + useEffect(() => { - RCInstance.auth.onAuthChange((user) => { - if (user) { - RCInstance.getCommandsList() - .then((data) => setCommands(data.commands || [])) - .catch(console.error); - - RCInstance.getChannelMembers(isChannelPrivate) - .then((channelMembers) => - setMembersHandler(channelMembers.members || []) - ) - .catch(console.error); - } - }); - }, [RCInstance, isChannelPrivate, setMembersHandler]); + if (!isUserAuthenticated) return; + RCInstance.getCommandsList() + .then((response) => setCommands(response.commands || [])) + .catch(console.error); + + RCInstance.getChannelMembers(isChannelPrivate) + .then((channelMembers) => setMembersHandler(channelMembers.members || [])) + .catch(console.error); + }, [RCInstance, isUserAuthenticated, isChannelPrivate, setMembersHandler]); useEffect(() => { if (editMessage.attachments) { messageRef.current.value = editMessage.attachments[0]?.description || editMessage.msg; + messageRef.current.focus(); } else if (editMessage.msg) { messageRef.current.value = editMessage.msg; + messageRef.current.focus(); } else { messageRef.current.value = ''; } }, [editMessage]); + useEffect(() => { + if ( + deletedMessage._id && + editMessage._id && + deletedMessage._id === editMessage._id + ) { + messageRef.current.value = ''; + setDisableButton(true); + setEditMessage({}); + } + }, [deletedMessage]); + + useEffect(() => { + if (data === null && inputRef.current) { + inputRef.current.value = ''; + } + }, [data]); + const getMessageLink = async (id) => { const host = RCInstance.getHost(); const res = await RCInstance.channelInfo(); @@ -168,7 +211,15 @@ const ChatInput = ({ scrollToBottom }) => { }; const handleNewLine = (e, addLine = true) => { - if (addLine) messageRef.current.value += '\n'; + if (addLine) { + const { selectionStart, selectionEnd, value } = messageRef.current; + messageRef.current.value = `${value.substring( + 0, + selectionStart + )}\n${value.substring(selectionEnd)}`; + messageRef.current.selectionStart = messageRef.current.selectionEnd; + messageRef.current.selectionEnd = selectionStart + 1; + } e.target.style.height = 'auto'; if (e.target.scrollHeight <= 150) { @@ -221,48 +272,57 @@ const ChatInput = ({ scrollToBottom }) => { } }; - const sendTypingStart = async () => { - try { - if (typingRef.current && messageRef.current.value?.length) { - return; - } - if (messageRef.current.value?.length) { - typingRef.current = true; - timerRef.current = setTimeout(() => { - typingRef.current = false; - }, [15000]); - await RCInstance.sendTypingStatus(username, true); - } else { - clearTimeout(timerRef.current); + const sendTypingStart = () => { + if (typingRef.current && messageRef.current.value?.length) { + return; + } + if (messageRef.current.value?.length) { + typingRef.current = true; + timerRef.current = setTimeout(() => { typingRef.current = false; - await RCInstance.sendTypingStatus(username, false); - } - } catch (e) { - console.error(e); + }, [15000]); + RCInstance.sendTypingStatus(username, true).catch(() => {}); + } else { + clearTimeout(timerRef.current); + typingRef.current = false; + RCInstance.sendTypingStatus(username, false).catch(() => {}); } }; - const sendTypingStop = async () => { - try { - typingRef.current = false; - await RCInstance.sendTypingStatus(username, false); - } catch (e) { - console.error(e); - } + const sendTypingStop = () => { + typingRef.current = false; + RCInstance.sendTypingStatus(username, false).catch(() => {}); }; const handleSendNewMessage = async (message) => { messageRef.current.value = ''; setDisableButton(true); - const { msg, attachments, _id } = quoteMessage; let pendingMessage = ''; - - if (msg || attachments) { - setQuoteMessage({}); - const msgLink = await getMessageLink(_id); + let quotedMessages = ''; + + if (quoteMessage.length > 0) { + // for (const quote of quoteMessage) { + // const { msg, attachments, _id } = quote; + // if (msg || attachments) { + // const msgLink = await getMessageLink(_id); + // quotedMessages += `[ ](${msgLink})`; + // } + // } + + const quoteArray = await Promise.all( + quoteMessage.map(async (quote) => { + const { msg, attachments, _id } = quote; + if (msg || attachments) { + const msgLink = await getMessageLink(_id); + quotedMessages += `[ ](${msgLink})`; + } + return quotedMessages; + }) + ); + quotedMessages = quoteArray.join(''); pendingMessage = createPendingMessage( - `[ ](${msgLink})\n ${message}`, + `${quotedMessages}\n${message}`, userInfo ); } else { @@ -283,10 +343,12 @@ const ChatInput = ({ scrollToBottom }) => { ECOptions.enableThreads ? threadId : undefined ); - if (!res.success) { - handleSendError('Error sending message, login again'); - } else { + if (res?.success) { + clearQuoteMessages(); replaceMessage(pendingMessage._id, res.message); + } else { + // If REST send failed, remove the pending message so it doesn't stay grey + removeMessage(pendingMessage._id); } }; @@ -307,7 +369,7 @@ const ChatInput = ({ scrollToBottom }) => { const handleCommandExecution = async (message) => { const execCommand = async (command, params) => { - await RCInstance.execCommand({ command, params }); + await RCInstance.execCommand({ command, params, tmid: threadId }); setFilteredCommands([]); }; @@ -351,6 +413,10 @@ const ChatInput = ({ scrollToBottom }) => { handleSendNewMessage(message); scrollToBottom(); + // Clear unread divider when user sends a message + if (clearUnreadDividerRef?.current) { + clearUnreadDividerRef.current(); + } }; const sendAttachment = (event) => { @@ -362,14 +428,21 @@ const ChatInput = ({ scrollToBottom }) => { setData(event.target.files[0]); }; - const onTextChange = (e) => { + const onTextChange = (e, val) => { sendTypingStart(); - const message = e.target.value; - messageRef.current.value = parseEmoji(message); + const message = val || e.target.value; + + // Don't parse emojis if user is currently typing emoji autocomplete + const shouldParseEmoji = !message.match(/:([a-zA-Z0-9_+-]*?)$/); + messageRef.current.value = shouldParseEmoji ? parseEmoji(message) : message; + setDisableButton(!messageRef.current.value.length); - handleNewLine(e, false); - searchMentionUser(message); - showCommands(e); + if (e !== null) { + handleNewLine(e, false); + searchMentionUser(message); + showCommands(e.target.selectionStart, e.target.value); + searchEmoji(message); + } }; const handleFocus = () => { @@ -384,6 +457,40 @@ const ChatInput = ({ scrollToBottom }) => { } }; + const handlePasting = (event) => { + const { clipboardData } = event; + + if (!clipboardData) { + return; + } + + const items = Array.from(clipboardData.items); + if ( + items.some(({ kind, type }) => kind === 'string' && type === 'text/plain') + ) { + return; + } + + const files = items + .filter( + (item) => item.kind === 'file' && item.type.indexOf('image/') !== -1 + ) + .map((item) => { + const fileItem = item.getAsFile(); + + if (!fileItem) { + return; + } + return fileItem; + }) + .filter((file) => !!file); + + if (files.length) { + event.preventDefault(); + handlePaste(files[0]); + } + }; + const onKeyDown = (e) => { switch (true) { case e.ctrlKey && e.code === 'KeyI': { @@ -411,11 +518,66 @@ const ChatInput = ({ scrollToBottom }) => { case e.code === 'Enter': e.preventDefault(); - if (!showCommandList && !showMembersList) { + if (!showCommandList && !showMembersList && !showEmojiList) { sendTypingStop(); sendMessage(); } break; + case (e.ctrlKey || e.altKey) && e.code === 'ArrowLeft': { + e.preventDefault(); + if (messageRef && messageRef.current) { + const { value, selectionStart } = messageRef.current; + let newPosition = selectionStart; + + while (newPosition > 0 && /\s/.test(value[newPosition - 1])) { + newPosition -= 1; + } + while (newPosition > 0 && !/\s/.test(value[newPosition - 1])) { + newPosition -= 1; + } + + messageRef.current.setSelectionRange(newPosition, newPosition); + messageRef.current.focus(); + } + break; + } + case (e.ctrlKey || e.altKey) && e.code === 'ArrowRight': { + e.preventDefault(); + if (messageRef && messageRef.current) { + const { value, selectionEnd } = messageRef.current; + let newPosition = selectionEnd; + + while (newPosition < value.length && /\s/.test(value[newPosition])) { + newPosition += 1; + } + while (newPosition < value.length && !/\s/.test(value[newPosition])) { + newPosition += 1; + } + + messageRef.current.setSelectionRange(newPosition, newPosition); + messageRef.current.focus(); + } + break; + } + case (e.ctrlKey || e.altKey) && e.code === 'ArrowUp': { + e.preventDefault(); + if (messageRef && messageRef.current) { + messageRef.current.setSelectionRange(0, 0); + messageRef.current.focus(); + } + break; + } + case (e.ctrlKey || e.altKey) && e.code === 'ArrowDown': { + e.preventDefault(); + if (messageRef && messageRef.current) { + const { current } = messageRef; + const { value } = current; + const { length } = value; + messageRef.current.setSelectionRange(length, length); + messageRef.current.focus(); + } + break; + } default: break; } @@ -423,10 +585,14 @@ const ChatInput = ({ scrollToBottom }) => { return ( - - {(quoteMessage.msg || quoteMessage.attachments) && ( - - )} + +
+ {quoteMessage && + quoteMessage.length > 0 && + quoteMessage.map((message, index) => ( + + ))} +
{editMessage.msg || editMessage.attachments || isChannelReadOnly ? ( { } /> ) : null} - - {showMembersList && ( - - )} + + {showMembersList && ( + + )} + {showCommandList && ( { /> )} + {showEmojiList && ( + + )} +
{ { sendTypingStop(); @@ -499,6 +694,7 @@ const ChatInput = ({ scrollToBottom }) => { }} onFocus={handleFocus} onKeyDown={onKeyDown} + onPaste={handlePasting} ref={messageRef} /> @@ -509,25 +705,32 @@ const ChatInput = ({ scrollToBottom }) => { `} > {isUserAuthenticated ? ( - sendMessage()} - type="primary" - disabled={disableButton || isRecordingMessage} - icon="send" - /> + !isChannelArchived ? ( + sendMessage()} + type="primary" + disabled={disableButton || isRecordingMessage} + icon="send" + /> + ) : null ) : ( - )}
- {isUserAuthenticated && ( + {isUserAuthenticated && !isChannelArchived && ( )}
diff --git a/packages/react/src/views/ChatInput/ChatInput.styles.js b/packages/react/src/views/ChatInput/ChatInput.styles.js index 73e91eb971..0841451324 100644 --- a/packages/react/src/views/ChatInput/ChatInput.styles.js +++ b/packages/react/src/views/ChatInput/ChatInput.styles.js @@ -10,6 +10,10 @@ export const getChatInputStyles = (theme) => { &.focused { border: ${`1.5px solid ${theme.colors.ring}`}; } + @media (max-width: 500px) { + margin: 0; + width: 100%; + } `, editMessage: css` @@ -22,6 +26,9 @@ export const getChatInputStyles = (theme) => { justify-content: center; flex-direction: row; padding: 0.5rem; + @media (max-width: 383px) { + min-height: 100px; + } `, iconCursor: css` @@ -51,6 +58,13 @@ export const getChatInputStyles = (theme) => { &::placeholder { padding-left: 5px; } + @media (max-width: 383px) { + font-size: 18px; + } + `, + quoteContainer: css` + max-height: 300px; + overflow: scroll; `, }; @@ -68,10 +82,30 @@ export const getChatInputFormattingToolbarStyles = ({ theme, mode }) => { : lighten(theme.colors.background, 1)}; display: flex; position: relative; - flex-direction: row; - gap: 0.375rem; + gap: 0.1rem; border-radius: 0 0 ${theme.radius} ${theme.radius}; `, + popOverStyles: css` + position: absolute; + bottom: 3rem; + left: 0; + width: 100%; + background: ${theme.colors.background}; + box-shadow: 0 -8px 10px ${mode === 'light' ? darken(theme.colors.background, 0.1) : lighten(theme.colors.background, 1)}; + border-radius: 8px; + padding: 1rem; + display: flex; + flex-direction: column; + align-items: flex-start; + z-index: 1300; + `, + popOverItemStyles: css` + display: flex; + gap: 0.5rem; + align-items: center; + cursor: pointer; + padding: 0.5rem; + `, }; return styles; }; @@ -84,21 +118,83 @@ export const getCommonRecorderStyles = (theme) => { border-radius: 50%; background-color: ${theme.colors.destructive}; margin: auto; - margin-right: 8px; + margin-right: 5px; + margin-left: 5px; + `, + + oppositeDot: css` + width: 0.5rem; + height: 0.5rem; + border-radius: 50%; + background-color: ${theme.colors.background}; + margin: auto; + margin-right: 5px; + margin-left: 5px; `, controller: css` - display: flex; - gap: 0.15rem; + width: 100%; + display: inline-flex; `, timer: css` margin: auto; `, + + spacer: css` + flex-grow: 1; + `, + record: css` display: flex; margin: auto; `, + + leftSection: css` + display: flex; + align-items: left; + `, + + rightSection: css` + display: flex; + align-items: right; + margin-top: 0.3rem; + `, + modal: { + '@media(max-width: 768px)': { + height: '100%', + width: '100%', + maxHeight: '100%', + maxWidth: '100%', + }, + }, + }; + + return styles; +}; + +export const getInsertLinkModalStyles = (theme) => { + const styles = { + inputWithFormattingBox: css` + border: 1px solid ${theme.colors.border}; + border-radius: ${theme.radius}; + margin: 0.5rem 1rem; + &.focused { + border: ${`1.5px solid ${theme.colors.ring}`}; + } + `, + modalHeader: css` + padding: 0 0.5rem; + `, + modalContent: css` + display: flex; + flex-direction: column; + gap: 0.5rem; + margin: 1rem 0; + `, + modalFooter: css` + padding: 0.75rem 1rem; + `, }; return styles; diff --git a/packages/react/src/views/ChatInput/ChatInputFormattingToolbar.js b/packages/react/src/views/ChatInput/ChatInputFormattingToolbar.js index 634b2255af..a68dc340f6 100644 --- a/packages/react/src/views/ChatInput/ChatInputFormattingToolbar.js +++ b/packages/react/src/views/ChatInput/ChatInputFormattingToolbar.js @@ -1,4 +1,4 @@ -import React, { useState } from 'react'; +import React, { useState, useRef, useEffect } from 'react'; import { css } from '@emotion/react'; import { Box, @@ -15,13 +15,17 @@ import AudioMessageRecorder from './AudioMessageRecorder'; import VideoMessageRecorder from './VideoMessageRecoder'; import { getChatInputFormattingToolbarStyles } from './ChatInput.styles'; import formatSelection from '../../lib/formatSelection'; +import InsertLinkToolBox from './InsertLinkToolBox'; const ChatInputFormattingToolbar = ({ messageRef, inputRef, + triggerButton, optionConfig = { - surfaceItems: ['emoji', 'formatter', 'audio', 'video', 'file'], + surfaceItems: ['emoji', 'formatter', 'link', 'audio', 'video', 'file'], formatters: ['bold', 'italic', 'strike', 'code', 'multiline'], + smallScreenSurfaceItems: ['emoji', 'video', 'audio', 'file'], + popOverItems: ['formatter', 'link'], }, }) => { const { classNames, styleOverrides, configOverrides } = useComponentOverrides( @@ -33,79 +37,207 @@ const ChatInputFormattingToolbar = ({ configOverrides.optionConfig?.surfaceItems || optionConfig.surfaceItems; const formatters = configOverrides.optionConfig?.formatters || optionConfig.formatters; - + const smallScreenSurfaceItems = + configOverrides.optionConfig?.smallScreenSurfaceItems || + optionConfig.smallScreenSurfaceItems; + const popOverItems = + configOverrides.optionConfig?.popOverItems || optionConfig.popOverItems; const isRecordingMessage = useMessageStore( (state) => state.isRecordingMessage ); const [isEmojiOpen, setEmojiOpen] = useState(false); + const [isInsertLinkOpen, setInsertLinkOpen] = useState(false); + const [isPopoverOpen, setPopoverOpen] = useState(false); + const popoverRef = useRef(null); const handleClickToOpenFiles = () => { inputRef.current.click(); }; - + const handleFormatterClick = (item) => { + formatSelection(messageRef, item.pattern); + setPopoverOpen(false); + }; const handleEmojiClick = (emojiEvent) => { const [emoji] = emojiEvent.names; - messageRef.current.value += ` :${emoji.replace(/[\s-]+/g, '_')}: `; + const message = `${messageRef.current.value} :${emoji.replace( + /[\s-]+/g, + '_' + )}: `; + triggerButton?.(null, message); + }; + + const handleAddLink = (linkText, linkUrl) => { + if (!linkText || !linkUrl) { + setInsertLinkOpen(false); + return; + } + + const start = messageRef.current.selectionStart; + const end = messageRef.current.selectionEnd; + const msg = messageRef.current.value; + const hyperlink = `[${linkText}](${linkUrl})`; + const message = msg.slice(0, start) + hyperlink + msg.slice(end); + + triggerButton?.(null, message); + setInsertLinkOpen(false); }; const chatToolMap = { - emoji: ( - - { + if (isRecordingMessage) return; setEmojiOpen(true); }} > - - - - ), + + emoji +
+ ) : ( + + { + if (isRecordingMessage) return; + setEmojiOpen(true); + }} + > + + + + ), + audio: ( - - - + ), video: ( - - - + ), - file: ( - - { + if (isRecordingMessage) return; + handleClickToOpenFiles(); + }} > - - - - ), - formatter: formatters - .map((name) => formatter.find((item) => item.name === name)) - .map((item) => ( - + + file +
+ ) : ( + { + if (isRecordingMessage) return; + handleClickToOpenFiles(); + }} + > + + + + ), + link: + isPopoverOpen && popOverItems.includes('link') ? ( + { + if (isRecordingMessage) return; + setInsertLinkOpen(true); + }} + > + + link + + ) : ( + + { - formatSelection(messageRef, item.pattern); + if (isRecordingMessage) return; + setInsertLinkOpen(true); }} > - + - )), + ), + formatter: formatters + .map((name) => formatter.find((item) => item.name === name)) + .map((item) => + isPopoverOpen && popOverItems.includes('formatter') ? ( + + { + if (isRecordingMessage) return; + handleFormatterClick(item); + }} + css={styles.popOverItemStyles} + > + + {item.name} + + + ) : ( + + { + if (isRecordingMessage) return; + formatSelection(messageRef, item.pattern); + }} + > + + + + ) + ), }; return ( @@ -114,8 +246,97 @@ const ChatInputFormattingToolbar = ({ className={`ec-chat-input-formatting-toolbar ${classNames}`} style={styleOverrides} > - {surfaceItems.map((key) => chatToolMap[key])} + + {surfaceItems.map((key) => chatToolMap[key])} + + {isPopoverOpen && ( + + {popOverItems.map((name) => { + const itemInFormatter = formatter.find( + (item) => item.name === name + ); + if (itemInFormatter) { + return ( + handleFormatterClick(itemInFormatter)} + css={styles.popOverItemStyles} + > + + {itemInFormatter.name} + + ); + } + return chatToolMap[name]; + })} + + )} + + {smallScreenSurfaceItems.map((name) => { + const itemInFormatter = formatter.find((item) => item.name === name); + if (itemInFormatter) { + return ( + + + formatSelection(messageRef, itemInFormatter.pattern) + } + > + + + + ); + } + return chatToolMap[name]; + })} + {popOverItems.length > 0 && ( + + { + if (isRecordingMessage) return; + setPopoverOpen(!isPopoverOpen); + }} + > + + + + )} + {isEmojiOpen && ( )} + + {isInsertLinkOpen && ( + setInsertLinkOpen(false)} + /> + )}
); }; diff --git a/packages/react/src/views/ChatInput/InsertLinkToolBox.js b/packages/react/src/views/ChatInput/InsertLinkToolBox.js new file mode 100644 index 0000000000..c8f9247628 --- /dev/null +++ b/packages/react/src/views/ChatInput/InsertLinkToolBox.js @@ -0,0 +1,83 @@ +import React, { useState, useEffect } from 'react'; +import { Modal, Input, Button, useTheme } from '@embeddedchat/ui-elements'; +import validator from 'validator'; +import { getInsertLinkModalStyles } from './ChatInput.styles'; + +const InsertLinkToolBox = ({ + handleAddLink, + selectedText, + onClose = () => {}, +}) => { + const { theme } = useTheme(); + const styles = getInsertLinkModalStyles(theme); + const [linkText, setLinkText] = useState(selectedText || ''); + const [linkUrl, setLinkUrl] = useState(''); + const [isUrlValid, setIsUrlValid] = useState(false); + + const validateUrl = (url) => + validator.isURL(url, { + protocols: ['http', 'https'], + require_protocol: true, + require_valid_protocol: true, + disallow_auth: true, + }); + + useEffect(() => { + const isValid = validateUrl(linkUrl); + setIsUrlValid(isValid); + }, [linkUrl]); + + const handleLinkTextOnChange = (e) => { + setLinkText(e.target.value); + }; + const handleLinkUrlOnChange = (e) => { + const url = e.target.value.trim(); + setLinkUrl(url); + setIsUrlValid(url ? validateUrl(url) : false); + }; + + const handleAdd = () => { + if (!isUrlValid) return; + handleAddLink(linkText, linkUrl); + }; + + return ( + + + Add link + + + + + + + + + + + + ); +}; + +export default InsertLinkToolBox; diff --git a/packages/react/src/views/ChatInput/VideoMessageRecoder.js b/packages/react/src/views/ChatInput/VideoMessageRecoder.js index 4d5b00810d..b45c821757 100644 --- a/packages/react/src/views/ChatInput/VideoMessageRecoder.js +++ b/packages/react/src/views/ChatInput/VideoMessageRecoder.js @@ -1,100 +1,58 @@ -import React, { - useState, - useEffect, - useCallback, - useContext, - useRef, -} from 'react'; +import React, { useState, useEffect, useCallback, useRef } from 'react'; import { css } from '@emotion/react'; import { Box, Icon, ActionButton, + Tooltip, Modal, useTheme, + Button, + lighten, + darken, } from '@embeddedchat/ui-elements'; -import { useMediaRecorder } from '../../hooks/useMediaRecorder'; -import RCContext from '../../context/RCInstance'; +import { useNewMediaRecorder } from '../../hooks/useMediaRecorder'; import useMessageStore from '../../store/messageStore'; import { getCommonRecorderStyles } from './ChatInput.styles'; +import useAttachmentWindowStore from '../../store/attachmentwindow'; -const VideoMessageRecorder = () => { +const VideoMessageRecorder = (props) => { const videoRef = useRef(null); + const [isRecording, setIsRecording] = useState(false); + const { disabled, displayName, popOverItemStyles } = props; const { theme } = useTheme(); + const { mode } = useTheme(); const styles = getCommonRecorderStyles(theme); - const toogleRecordingMessage = useMessageStore( - (state) => state.toogleRecordingMessage - ); + const [state, setRecordState] = useState('idle'); // 1. idle, 2. preview. - const { RCInstance, ECOptions } = useContext(RCContext); - const [state, setRecordState] = useState('idle'); const [time, setTime] = useState('00:00'); const [recordingInterval, setRecordingInterval] = useState(null); const [file, setFile] = useState(null); - const [isRecorded, setIsRecorded] = useState(false); - const threadId = useMessageStore((_state) => _state.threadMainMessage?._id); - const onStop = (videoChunks) => { - const videoBlob = new Blob(videoChunks, { type: 'video/mp4' }); - const fileName = 'Video record.mp4'; - setFile(new File([videoBlob], fileName, { type: 'video/mp4' })); - }; + const [isSendDisabled, setIsSendDisabled] = useState(true); - const [start, stop] = useMediaRecorder({ - constraints: { audio: true, video: true }, // Update constraints as needed - onStop, + const { toggle, setData } = useAttachmentWindowStore((state_) => ({ + toggle: state_.toggle, + setData: state_.setData, + })); + + const { + startCameraAndMic, + startRecording, + stopRecording, + deleteRecording, + stopCameraAndMic, + } = useNewMediaRecorder({ + constraints: { video: true, audio: true }, videoRef, + onStop: (videoChunks) => { + const videoBlob = new Blob(videoChunks, { type: 'video/mp4' }); + const fileName = 'Video record.mp4'; + setFile(new File([videoBlob], fileName, { type: 'video/mp4' })); + }, }); - const stopRecording = async () => { - stop(); - if (recordingInterval) { - clearInterval(recordingInterval); - } - setRecordingInterval(null); - setTime('00:00'); - setRecordState('idle'); - }; - - const handleRecordButtonClick = () => { - setRecordState('recording'); - try { - start(videoRef.current); - toogleRecordingMessage(); - const startTime = new Date(); - setRecordingInterval( - setInterval(() => { - const now = new Date(); - const distance = (now.getTime() - startTime.getTime()) / 1000; - const minutes = Math.floor(distance / 60); - const seconds = Math.floor(distance % 60); - setTime( - `${String(minutes).padStart(2, '0')}:${String(seconds).padStart( - 2, - '0' - )}` - ); - }, 1000) - ); - } catch (error) { - console.log(error); - setRecordState('idle'); - } - }; - - const handleCancelRecordButton = async () => { - toogleRecordingMessage(); - await stopRecording(); - setIsRecorded(false); - }; - - const handleStopRecordButton = async () => { - toogleRecordingMessage(); - setIsRecorded(true); - await stopRecording(); - }; - const handleMount = useCallback(async () => { if (navigator.permissions) { try { @@ -128,50 +86,119 @@ const VideoMessageRecorder = () => { } catch (error) { console.warn(error); } - }); + }, []); useEffect(() => { handleMount(); }, [handleMount]); - useEffect(() => { - const sendRecording = async () => { - await RCInstance.sendAttachment( - file, - undefined, - undefined, - ECOptions.enableThreads ? threadId : undefined - ); - }; - if (isRecorded && file) { - sendRecording(); - setIsRecorded(false); + const startRecordingInterval = () => { + const startTime = new Date(); + setRecordingInterval( + setInterval(() => { + const now = new Date(); + const distance = (now.getTime() - startTime.getTime()) / 1000; + const minutes = Math.floor(distance / 60); + const seconds = Math.floor(distance % 60); + setTime( + `${String(minutes).padStart(2, '0')}:${String(seconds).padStart( + 2, + '0' + )}` + ); + }, 1000) + ); + }; + + const stopRecordingInterval = () => { + if (recordingInterval) { + clearInterval(recordingInterval); } + setRecordingInterval(null); + }; + + const deleteRecordingInterval = () => { + stopRecordingInterval(); + setTime('00:00'); + }; + + const openWindowToRecord = () => { + startCameraAndMic(); + setRecordState('preview'); + }; + + const handleStartRecording = () => { + deleteRecordingInterval(); + setIsRecording(true); + startRecording(); + startRecordingInterval(); + setIsSendDisabled(true); + }; + + const handleStopRecording = () => { + stopRecording(); + stopRecordingInterval(); + setIsRecording(false); + setIsSendDisabled(false); + }; + + const handleSendRecording = () => { + if (isRecording) return; if (file) { - setFile(null); + toggle(); + setData(file); } - }, [isRecorded, file]); + deleteRecordingInterval(); + deleteRecording(); + stopCameraAndMic(); + setRecordState('idle'); + setIsSendDisabled(true); + }; + + const closeWindowStopRecord = () => { + stopRecording(); + deleteRecordingInterval(); + deleteRecording(); + stopCameraAndMic(); + setRecordState('idle'); + setIsSendDisabled(true); + }; return ( <> - {state === 'idle' && ( - - - - )} + {state === 'idle' && + (displayName ? ( + + + {displayName} + + ) : ( + + + + + + ))} - {state === 'recording' && ( + {state === 'preview' && ( <> diff --git a/packages/react/src/views/ChatLayout/ChatLayout.js b/packages/react/src/views/ChatLayout/ChatLayout.js index 6243dc0cc8..d3202a4faa 100644 --- a/packages/react/src/views/ChatLayout/ChatLayout.js +++ b/packages/react/src/views/ChatLayout/ChatLayout.js @@ -1,4 +1,4 @@ -import React, { useRef } from 'react'; +import React, { useEffect, useRef, useCallback } from 'react'; import { Box, useComponentOverrides } from '@embeddedchat/ui-elements'; import styles from './ChatLayout.styles'; import { @@ -35,10 +35,17 @@ import useUiKitStore from '../../store/uiKitStore'; const ChatLayout = () => { const messageListRef = useRef(null); + const clearUnreadDividerRef = useRef(null); const { classNames, styleOverrides } = useComponentOverrides('ChatBody'); - const { ECOptions } = useRCContext(); + const { RCInstance, ECOptions } = useRCContext(); const anonymousMode = ECOptions?.anonymousMode; - const showRoles = ECOptions?.anonymousMode; + const showRoles = ECOptions?.showRoles; + const setStarredMessages = useStarredMessageStore( + (state) => state.setStarredMessages + ); + const starredMessages = useStarredMessageStore( + (state) => state.starredMessages + ); const showSidebar = useSidebarStore((state) => state.showSidebar); const showMentions = useMentionsStore((state) => state.showMentions); const showAllFiles = useFileStore((state) => state.showAllFiles); @@ -46,6 +53,9 @@ const ChatLayout = () => { (state) => state.showAllThreads ); const showPinned = usePinnedMessageStore((state) => state.showPinned); + const setPinnedMessages = usePinnedMessageStore( + (state) => state.setPinnedMessages + ); const showStarred = useStarredMessageStore((state) => state.showStarred); const showSearch = useSearchMessageStore((state) => state.showSearch); const showChannelinfo = useChannelStore((state) => state.showChannelinfo); @@ -57,6 +67,9 @@ const ChatLayout = () => { const attachmentWindowOpen = useAttachmentWindowStore( (state) => state.attachmentWindowOpen ); + const isUserAuthenticated = useUserStore( + (state) => state.isUserAuthenticated + ); const { data, handleDrag, handleDragDrop } = useDropBox(); const { uiKitContextualBarOpen, uiKitContextualBarData } = useUiKitStore( (state) => ({ @@ -72,7 +85,53 @@ const ChatLayout = () => { }); } }; + const getStarredMessages = useCallback(async () => { + if (isUserAuthenticated && showStarred) { + try { + if (!isUserAuthenticated && !anonymousMode) { + return; + } + const { messages } = await RCInstance.getStarredMessages(); + setStarredMessages(messages); + } catch (e) { + console.error(e); + } + } + }, [ + isUserAuthenticated, + anonymousMode, + RCInstance, + showStarred, + setStarredMessages, + ]); + const getPinnedMessages = useCallback(async () => { + if (isUserAuthenticated && showPinned) { + try { + if (!isUserAuthenticated && !anonymousMode) { + return; + } + const { messages } = await RCInstance.getPinnedMessages(); + setPinnedMessages(messages); + } catch (e) { + console.error(e); + } + } + }, [ + isUserAuthenticated, + anonymousMode, + RCInstance, + showPinned, + setPinnedMessages, + ]); + + useEffect(() => { + getStarredMessages(); + }, [getStarredMessages, showSidebar, showStarred]); + + useEffect(() => { + getPinnedMessages(); + }, [getPinnedMessages, showSidebar, showPinned]); return ( { showRoles={showRoles} messageListRef={messageListRef} scrollToBottom={scrollToBottom} + clearUnreadDividerRef={clearUnreadDividerRef} + /> + -
diff --git a/packages/react/src/views/ChatLayout/ChatLayout.styles.js b/packages/react/src/views/ChatLayout/ChatLayout.styles.js index 3afa726498..56dd748cbe 100644 --- a/packages/react/src/views/ChatLayout/ChatLayout.styles.js +++ b/packages/react/src/views/ChatLayout/ChatLayout.styles.js @@ -12,6 +12,7 @@ const styles = { flex: 1; flex-direction: column; position: relative; + min-width: 0; `, sidebar: css` diff --git a/packages/react/src/views/DynamicHeader/DynamicHeader.js b/packages/react/src/views/DynamicHeader/DynamicHeader.js index 4ef1d9b9a0..22da5bc781 100644 --- a/packages/react/src/views/DynamicHeader/DynamicHeader.js +++ b/packages/react/src/views/DynamicHeader/DynamicHeader.js @@ -3,6 +3,7 @@ import PropTypes from 'prop-types'; import { css } from '@emotion/react'; import { Box, Icon, ActionButton, Heading } from '@embeddedchat/ui-elements'; import useDynamicHeaderStyles from './DynamicHeader.styles'; +import { Markdown } from '../Markdown'; const DynamicHeader = ({ title, @@ -11,6 +12,22 @@ const DynamicHeader = ({ iconName, headerIconName, }) => { + const messageDescription = (msg) => { + if (msg.file) { + if (msg.attachments[0]?.description) { + return ( + + ); + } + return msg.file.name; + } + return ; + }; + const styles = useDynamicHeaderStyles(); return ( @@ -32,8 +49,8 @@ const DynamicHeader = ({ - - {title} + + {messageDescription(title)} {isHeaderIcon && } diff --git a/packages/react/src/views/DynamicHeader/DynamicHeader.styles.js b/packages/react/src/views/DynamicHeader/DynamicHeader.styles.js index 1df4bf2206..d04577ba57 100644 --- a/packages/react/src/views/DynamicHeader/DynamicHeader.styles.js +++ b/packages/react/src/views/DynamicHeader/DynamicHeader.styles.js @@ -12,7 +12,7 @@ const useDynamicHeaderStyles = () => { `, clearSpacing: css` - margin: 0; + margin-bottom: 1px; padding: 0; text-overflow: ellipsis; white-space: nowrap; diff --git a/packages/react/src/views/EmbeddedChat.js b/packages/react/src/views/EmbeddedChat.js index 2dc8379879..a15cdbccd1 100644 --- a/packages/react/src/views/EmbeddedChat.js +++ b/packages/react/src/views/EmbeddedChat.js @@ -18,7 +18,7 @@ import { import { ChatLayout } from './ChatLayout'; import { ChatHeader } from './ChatHeader'; import { RCInstanceProvider } from '../context/RCInstance'; -import { useUserStore, useLoginStore } from '../store'; +import { useUserStore, useLoginStore, useMessageStore } from '../store'; import DefaultTheme from '../theme/DefaultTheme'; import { getTokenStorage } from '../lib/auth'; import { styles } from './EmbeddedChat.styles'; @@ -26,11 +26,13 @@ import GlobalStyles from './GlobalStyles'; import { overrideECProps } from '../lib/overrideECProps'; const EmbeddedChat = (props) => { - const [config, setConfig] = useState(() => props); + const [remoteOverrides, setRemoteOverrides] = useState({}); - useEffect(() => { - setConfig(props); - }, [props]); + const config = useMemo( + () => ({ ...props, ...remoteOverrides }), + // eslint-disable-next-line react-hooks/exhaustive-deps + [props, remoteOverrides] + ); const { isClosable = false, @@ -44,6 +46,7 @@ const EmbeddedChat = (props) => { toastBarPosition = 'bottom right', showRoles = false, showAvatar = true, + showAnnouncement = true, showUsername = false, showName = true, enableThreads = false, @@ -51,21 +54,24 @@ const EmbeddedChat = (props) => { className = '', style = {}, hideHeader = false, - auth = { - flow: 'PASSWORD', - }, + auth: authProp = null, secure = false, dark = false, remoteOpt = false, } = config; + const auth = useMemo( + () => authProp ?? { flow: 'PASSWORD' }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [authProp?.flow, authProp?.credentials] + ); + const hasMounted = useRef(false); const { classNames, styleOverrides } = useComponentOverrides('EmbeddedChat'); const [fullScreen, setFullScreen] = useState(false); const [isSynced, setIsSynced] = useState(!remoteOpt); const { getToken, saveToken, deleteToken } = getTokenStorage(secure); const { - isUserAuthenticated, setIsUserAuthenticated, setUsername: setAuthenticatedUsername, setUserAvatarUrl: setAuthenticatedAvatarUrl, @@ -83,6 +89,7 @@ const EmbeddedChat = (props) => { })); const setIsLoginIn = useLoginStore((state) => state.setIsLoginIn); + const setMessages = useMessageStore((state) => state.setMessages); if (isClosable && !setClosableState) { throw Error( @@ -101,24 +108,52 @@ const EmbeddedChat = (props) => { }, [host, roomId, getToken, deleteToken, saveToken]); const [RCInstance, setRCInstance] = useState(() => initializeRCInstance()); + const rcInstanceRef = useRef(RCInstance); + rcInstanceRef.current = RCInstance; useEffect(() => { - const reInstantiate = () => { - const newRCInstance = initializeRCInstance(); - setRCInstance(newRCInstance); - }; - if (!hasMounted.current) { hasMounted.current = true; return; } - RCInstance.close().then(reInstantiate).catch(console.error); + const newRCInstance = initializeRCInstance(); + const oldRCInstance = rcInstanceRef.current; - return () => { - RCInstance.close().catch(console.error); - }; - }, [roomId, host, initializeRCInstance]); + // Clear global state so that the UI resets and waits for new host's auth and data + setIsUserAuthenticated(false); + setAuthenticatedUsername(null); + setAuthenticatedAvatarUrl(null); + setAuthenticatedUserId(null); + setAuthenticatedName(null); + setAuthenticatedUserRoles([]); + setMessages([]); + + setRCInstance(newRCInstance); + oldRCInstance.close().catch((e) => console.error(e?.message || e)); + }, [ + roomId, + host, + initializeRCInstance, + setIsUserAuthenticated, + setAuthenticatedUsername, + setAuthenticatedAvatarUrl, + setAuthenticatedUserId, + setAuthenticatedName, + setAuthenticatedUserRoles, + setMessages, + ]); + + useEffect( + () => () => { + if (hasMounted.current) { + rcInstanceRef.current + .close() + .catch((e) => console.error(e?.message || e)); + } + }, + [] + ); useEffect(() => { const autoLogin = async () => { @@ -126,7 +161,7 @@ const EmbeddedChat = (props) => { try { await RCInstance.autoLogin(auth); } catch (error) { - console.error(error); + console.error(error?.message || error); } finally { setIsLoginIn(false); } @@ -135,24 +170,33 @@ const EmbeddedChat = (props) => { }, [RCInstance, auth, setIsLoginIn]); useEffect(() => { - RCInstance.auth.onAuthChange((user) => { + const handleAuthChange = (user) => { if (user) { RCInstance.connect() .then(() => { console.log(`Connected to RocketChat ${RCInstance.host}`); - const { me } = user; - setAuthenticatedAvatarUrl(me.avatarUrl); - setAuthenticatedUsername(me.username); - setAuthenticatedUserId(me._id); - setAuthenticatedName(me.name); - setAuthenticatedUserRoles(me.roles); + const me = user.me || user.data?.me; + if (me) { + setAuthenticatedAvatarUrl(me.avatarUrl); + setAuthenticatedUsername(me.username); + setAuthenticatedUserId(me._id); + setAuthenticatedName(me.name); + setAuthenticatedUserRoles(me.roles); + } setIsUserAuthenticated(true); }) .catch(console.error); } else { + // Close the DDP connection on logout so the next login gets a fresh connection. + RCInstance.close().catch(console.error); setIsUserAuthenticated(false); } - }); + }; + RCInstance.auth.onAuthChange(handleAuthChange); + + return () => { + RCInstance.auth.removeAuthListener(handleAuthChange); + }; }, [ RCInstance, setAuthenticatedName, @@ -170,10 +214,10 @@ const EmbeddedChat = (props) => { if (appInfo) { const remoteConfig = appInfo.propConfig; - setConfig((prevConfig) => overrideECProps(prevConfig, remoteConfig)); + setRemoteOverrides((prev) => overrideECProps(prev, remoteConfig)); } } catch (error) { - console.error('Error fetching remote config:', error); + console.error('Error fetching remote config:', error?.message || error); } finally { setIsSynced(true); } @@ -181,7 +225,7 @@ const EmbeddedChat = (props) => { if (remoteOpt) { getConfig(); } - }, [RCInstance, remoteOpt, setConfig, setIsSynced]); + }, [RCInstance, remoteOpt, setIsSynced]); const ECOptions = useMemo( () => ({ @@ -195,6 +239,7 @@ const EmbeddedChat = (props) => { showName, showRoles, showAvatar, + showAnnouncement, showUsername, hideHeader, anonymousMode, @@ -210,6 +255,7 @@ const EmbeddedChat = (props) => { showName, showRoles, showAvatar, + showAnnouncement, showUsername, hideHeader, anonymousMode, @@ -272,6 +318,7 @@ EmbeddedChat.propTypes = { toastBarPosition: PropTypes.string, showRoles: PropTypes.bool, showAvatar: PropTypes.bool, + showAnnouncement: PropTypes.bool, enableThreads: PropTypes.bool, theme: PropTypes.object, auth: PropTypes.oneOfType([ diff --git a/packages/react/src/views/EmojiList/EmojiList.js b/packages/react/src/views/EmojiList/EmojiList.js new file mode 100644 index 0000000000..96528b1ce4 --- /dev/null +++ b/packages/react/src/views/EmojiList/EmojiList.js @@ -0,0 +1,162 @@ +import React, { useCallback, useEffect, useRef } from 'react'; +import PropTypes from 'prop-types'; +import { Box, useTheme } from '@embeddedchat/ui-elements'; +import getEmojiListStyles from './EmojiList.styles'; + +function EmojiList({ + emojiIndex, + messageRef, + filteredEmojis, + setFilteredEmojis, + setEmojiIndex, + setStartReadEmoji, + setShowEmojiList, +}) { + const itemRefs = useRef([]); + const { theme } = useTheme(); + const styles = getEmojiListStyles(theme); + + const handleEmojiClick = useCallback( + (selectedEmoji) => { + const currentMessage = messageRef.current.value; + const emojiMatch = currentMessage.match(/:(.*?)$/); + + if (emojiMatch) { + // Replace the :query with the selected emoji + const beforeQuery = currentMessage.substring( + 0, + currentMessage.lastIndexOf(':') + ); + const insertionText = `${beforeQuery}${selectedEmoji.emoji} `; + + messageRef.current.value = insertionText; + + // Set cursor position after the emoji and space + const cursorPosition = insertionText.length; + messageRef.current.setSelectionRange(cursorPosition, cursorPosition); + messageRef.current.focus(); + + // Clear emoji autocomplete state + setFilteredEmojis([]); + setEmojiIndex(-1); + setStartReadEmoji(false); + setShowEmojiList(false); + } + }, + [ + messageRef, + setFilteredEmojis, + setEmojiIndex, + setShowEmojiList, + setStartReadEmoji, + ] + ); + + const setItemRef = (el, index) => { + itemRefs.current[index] = el; + }; + + useEffect(() => { + const handleKeyPress = (event) => { + switch (event.key) { + case 'Enter': { + const selectedEmoji = filteredEmojis[emojiIndex]; + if (selectedEmoji) { + handleEmojiClick(selectedEmoji); + } + break; + } + case 'Escape': { + // Cancel emoji selection + setFilteredEmojis([]); + setEmojiIndex(-1); + setStartReadEmoji(false); + setShowEmojiList(false); + messageRef.current.focus(); + break; + } + case 'ArrowUp': + event.preventDefault(); + setEmojiIndex( + emojiIndex - 1 < 0 ? filteredEmojis.length - 1 : emojiIndex - 1 + ); + break; + case 'ArrowDown': + event.preventDefault(); + setEmojiIndex( + emojiIndex + 1 >= filteredEmojis.length ? 0 : emojiIndex + 1 + ); + break; + default: + break; + } + }; + + document.addEventListener('keydown', handleKeyPress); + + return () => { + document.removeEventListener('keydown', handleKeyPress); + }; + }, [ + emojiIndex, + filteredEmojis, + handleEmojiClick, + setEmojiIndex, + setFilteredEmojis, + setStartReadEmoji, + setShowEmojiList, + messageRef, + ]); + + useEffect(() => { + if (itemRefs.current[emojiIndex]) { + itemRefs.current[emojiIndex].scrollIntoView({ + block: 'nearest', + }); + } + }, [emojiIndex]); + + if (!filteredEmojis || filteredEmojis.length === 0) { + return null; + } + + return ( + +
    + {filteredEmojis.map((emoji, index) => ( +
  • handleEmojiClick(emoji)} + ref={(el) => setItemRef(el, index)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + handleEmojiClick(emoji); + } + }} + style={{ + backgroundColor: index === emojiIndex && 'rgba(0, 0, 0, 0.1)', + color: index === emojiIndex && theme.colors.foreground, + }} + > + {emoji.emoji} + :{emoji.shortname}: +
  • + ))} +
+
+ ); +} + +EmojiList.propTypes = { + emojiIndex: PropTypes.number, + messageRef: PropTypes.object.isRequired, + filteredEmojis: PropTypes.array, + setFilteredEmojis: PropTypes.func.isRequired, + setEmojiIndex: PropTypes.func.isRequired, + setStartReadEmoji: PropTypes.func.isRequired, + setShowEmojiList: PropTypes.func.isRequired, +}; + +export default EmojiList; diff --git a/packages/react/src/views/EmojiList/EmojiList.styles.js b/packages/react/src/views/EmojiList/EmojiList.styles.js new file mode 100644 index 0000000000..098e0a2bd4 --- /dev/null +++ b/packages/react/src/views/EmojiList/EmojiList.styles.js @@ -0,0 +1,53 @@ +import { css } from '@emotion/react'; + +const getEmojiListStyles = (theme) => { + const styles = { + main: css` + margin: 0.2rem 2rem; + display: block; + max-height: 10rem; + overflow-y: auto; + overflow-x: hidden; + border: 1px solid ${theme.colors.border}; + border-radius: 0.2rem; + background-color: ${theme.colors.background}; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); + z-index: 1000; + position: relative; + `, + + listItem: css` + cursor: pointer; + display: flex; + align-items: center; + padding: 0.5rem 0.75rem; + font-size: 14px; + border-bottom: 1px solid ${theme.colors.border}; + transition: background-color 0.2s ease; + + &:hover { + background-color: ${theme.colors.secondary}; + } + + &:last-child { + border-bottom: none; + } + `, + + emoji: css` + font-size: 16px; + margin-right: 0.5rem; + flex-shrink: 0; + `, + + shortname: css` + font-family: monospace; + color: ${theme.colors.mutedForeground}; + font-size: 12px; + `, + }; + + return styles; +}; + +export default getEmojiListStyles; diff --git a/packages/react/src/views/EmojiList/index.js b/packages/react/src/views/EmojiList/index.js new file mode 100644 index 0000000000..794f574143 --- /dev/null +++ b/packages/react/src/views/EmojiList/index.js @@ -0,0 +1 @@ +export { default as EmojiList } from './EmojiList'; diff --git a/packages/react/src/views/EmojiPicker/EmojiPicker.js b/packages/react/src/views/EmojiPicker/EmojiPicker.js index e8e2926675..6501eb8320 100644 --- a/packages/react/src/views/EmojiPicker/EmojiPicker.js +++ b/packages/react/src/views/EmojiPicker/EmojiPicker.js @@ -17,11 +17,10 @@ const CustomEmojiPicker = ({ }) => { const theme = useTheme(); const styles = getEmojiPickerStyles(theme); - const previewConfig = { defaultEmoji: '1f60d', defaultCaption: 'None', - showPreview: false, + showPreview: true, }; return ( @@ -34,11 +33,11 @@ const CustomEmojiPicker = ({ > diff --git a/packages/react/src/views/EmojiPicker/EmojiPicker.styles.js b/packages/react/src/views/EmojiPicker/EmojiPicker.styles.js index 457c3984c5..72350e13ee 100644 --- a/packages/react/src/views/EmojiPicker/EmojiPicker.styles.js +++ b/packages/react/src/views/EmojiPicker/EmojiPicker.styles.js @@ -14,7 +14,7 @@ const getEmojiPickerStyles = ({ theme, mode }) => { --epr-picker-border-color: ${theme.colors.border}; --epr-category-label-bg-color: ${theme.colors.background}; --epr-category-icon-active-color: ${theme.colors.secondary}; - --epr-emoji-size: 20px; + --epr-emoji-size: 25px; --epr-category-navigation-button-size: 20px; --epr-emoji-gap: 10px; @@ -38,7 +38,7 @@ const getEmojiPickerStyles = ({ theme, mode }) => { --epr-search-bar-inner-padding: var(--epr-horizontal-padding); --epr-emoji-variation-picker-height: 45px; --epr-emoji-variation-picker-bg-color: var(--epr-bg-color); - --epr-preview-height: 70px; + --epr-preview-height: 65px; --epr-preview-text-size: 14px; --epr-preview-text-padding: 0 var(--epr-horizontal-padding); --epr-preview-border-color: var(--epr-picker-border-color); @@ -49,9 +49,7 @@ const getEmojiPickerStyles = ({ theme, mode }) => { --epr-category-label-height: 40px; --epr-emoji-padding: 5px; - --epr-emoji-fullsize: calc( - var(--epr-emoji-size) + var(--epr-emoji-padding) * 2 - ); + --epr-emoji-hover-color: var(--epr-hover-bg-color); --epr-emoji-variation-indicator-color: var(--epr-picker-border-color); --epr-emoji-variation-indicator-color-hover: var(--epr-text-color); @@ -60,11 +58,11 @@ const getEmojiPickerStyles = ({ theme, mode }) => { --epr-category-label-z-index: 2; --epr-skin-variation-picker-z-index: 5; --epr-preview-z-index: 6; + --epr-search-input-bg-color: ${calculatedColors}; /* Use these properties of color if needed -> --epr-shadow: 'theme-color'; - --epr-search-input-bg-color: 'theme-color'; --epr-skin-tone-picker-menu-color: 'theme-color'; --epr-dark: 'theme-color' --epr-dark-emoji-variation-picker-bg-color: var(--epr-dark); diff --git a/packages/react/src/views/EmojiReaction/EmojiReaction.js b/packages/react/src/views/EmojiReaction/EmojiReaction.js index a85dfc92fc..80ba34d76e 100644 --- a/packages/react/src/views/EmojiReaction/EmojiReaction.js +++ b/packages/react/src/views/EmojiReaction/EmojiReaction.js @@ -7,7 +7,7 @@ import DOMPurify from 'dompurify'; const EmojiReaction = ({ body }) => { const emojiHtml = emojione.toImage(body); - + emojione.imageTitleTag = false; return ( { +const FileMessage = ({ fileMessage, onDeleteFile }) => { const { classNames, styleOverrides } = useComponentOverrides('FileMessage'); const dispatchToastMessage = useToastBarDispatch(); const { RCInstance } = useRCContext(); const messages = useMessageStore((state) => state.messages); + const [files, setFiles] = useState([]); + const theme = useTheme(); + const isChannelPrivate = useChannelStore((state) => state.isChannelPrivate); + const [isFetching, setIsFetching] = useState(true); + const { mode } = theme; + const messageStyles = styles.message; + + const hoverStyle = { + '&:hover': { + backgroundColor: + mode === 'light' + ? darken(theme.theme.colors.background, 0.03) + : lighten(theme.theme.colors.background, 1), + }, + }; const [fileToDelete, setFileToDelete] = useState({}); @@ -59,6 +83,19 @@ const FileMessage = ({ fileMessage }) => { }, [messages, RCInstance, dispatchToastMessage] ); + useEffect(() => { + const fetchAllFiles = async () => { + const res = await RCInstance.getAllFiles(isChannelPrivate, ''); + if (res?.files) { + const sortedFiles = res.files.sort( + (a, b) => new Date(b.uploadedAt) - new Date(a.uploadedAt) + ); + setFiles(sortedFiles); + setIsFetching(false); + } + }; + fetchAllFiles(); + }, [RCInstance, isChannelPrivate, messages, fileToDelete]); const handleOnClose = () => { setFileToDelete({}); @@ -69,7 +106,7 @@ const FileMessage = ({ fileMessage }) => { @@ -132,6 +169,7 @@ const FileMessage = ({ fileMessage }) => { FileMessage.propTypes = { fileMessage: PropTypes.any.isRequired, + onDeleteFile: PropTypes.func, }; export default memo(FileMessage); diff --git a/packages/react/src/views/GlobalStyles.js b/packages/react/src/views/GlobalStyles.js index b26977e635..ca4d72fa97 100644 --- a/packages/react/src/views/GlobalStyles.js +++ b/packages/react/src/views/GlobalStyles.js @@ -8,7 +8,6 @@ const getGlobalStyles = (theme) => css` margin: 0; padding: 0; } - .ec-embedded-chat body { font-family: ${theme.typography.default.fontFamily}; font-size: ${theme.typography.default.fontSize}px; @@ -31,11 +30,23 @@ const getGlobalStyles = (theme) => css` .ec-embedded-chat ::-webkit-scrollbar-thumb:hover { background: ${theme.colors.primary}; + cursor: pointer; } .ec-embedded-chat ::-webkit-scrollbar-button { display: none; } + @media (max-width: 780px) { + .ec-sidebar { + position: absolute; + width: 100% !important; + height: calc(100% - 56.39px) !important; + min-width: 250px !important; + left: 0; + bottom: 0; + background: ${theme.colors.background}!important; + } + } `; const GlobalStyles = () => { diff --git a/packages/react/src/views/LinkPreview/LinkPreview.js b/packages/react/src/views/LinkPreview/LinkPreview.js index 7290714edc..62ae860001 100644 --- a/packages/react/src/views/LinkPreview/LinkPreview.js +++ b/packages/react/src/views/LinkPreview/LinkPreview.js @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import PropTypes from 'prop-types'; -import { css } from '@emotion/react'; import { Box, ActionButton, @@ -20,6 +19,7 @@ const LinkPreview = ({ }) => { const { classNames, styleOverrides } = useComponentOverrides('LinkPreview'); const { theme } = useTheme(); + const { mode } = useTheme(); const styles = getLinkPreviewStyles(theme); const [isPreviewOpen, setIsPreviewOpen] = useState(true); @@ -88,9 +88,12 @@ const LinkPreview = ({ @@ -100,9 +103,12 @@ const LinkPreview = ({ {isSiteName && ( diff --git a/packages/react/src/views/LoginForm/LoginForm.js b/packages/react/src/views/LoginForm/LoginForm.js index 1285e5e1eb..abf6e6e33a 100644 --- a/packages/react/src/views/LoginForm/LoginForm.js +++ b/packages/react/src/views/LoginForm/LoginForm.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react'; +import React, { useState, useRef } from 'react'; import { css } from '@emotion/react'; import { GenericModal, @@ -13,8 +13,8 @@ import { useRCAuth } from '../../hooks/useRCAuth'; import styles from './LoginForm.styles'; export default function LoginForm() { - const [userOrEmail, setUserOrEmail] = useState(null); - const [password, setPassword] = useState(null); + const userRef = useRef(null); + const passRef = useRef(null); const [showPassword, setShowPassword] = useState(false); const [usernameError, setUsernameError] = useState(false); const [passwordError, setPasswordError] = useState(false); @@ -26,36 +26,40 @@ export default function LoginForm() { const { theme } = useTheme(); - useEffect(() => { - if (userOrEmail !== null && userOrEmail.trim() === '') { + const handleSubmit = (e) => { + if (e && e.preventDefault) e.preventDefault(); + const userOrEmail = userRef.current?.value || ''; + const password = passRef.current?.value || ''; + + let hasError = false; + if (userOrEmail.trim() === '') { setUsernameError(true); + hasError = true; } else { setUsernameError(false); } - if (password !== null && password.trim() === '') { + if (password.trim() === '') { setPasswordError(true); + hasError = true; } else { setPasswordError(false); } - }, [userOrEmail, password]); - const handleSubmit = () => { - if (!userOrEmail) setUserOrEmail(''); - if (!password) setPassword(''); - handleLogin(userOrEmail, password); + if (!hasError) { + handleLogin(userOrEmail, password); + } }; + const handleClose = () => { - setUserOrEmail(null); - setPassword(null); setIsLoginModalOpen(false); }; - const handleEdituserOrEmail = (e) => { - setUserOrEmail(e.target.value); + const handleEdituserOrEmail = () => { + if (usernameError) setUsernameError(false); }; - const handleEditPassword = (e) => { - setPassword(e.target.value); + const handleEditPassword = () => { + if (passwordError) setPasswordError(false); }; const handleTogglePassword = () => { setShowPassword(!showPassword); @@ -69,15 +73,18 @@ export default function LoginForm() { const fields = [ { label: 'Email or username', + ref: userRef, onChange: handleEdituserOrEmail, placeholder: 'example@example.com', error: usernameError, }, { label: 'Password', + ref: passRef, type: showPassword ? 'text' : 'password', onChange: handleEditPassword, error: passwordError, + autoComplete: 'new-password', }, ]; @@ -96,6 +103,7 @@ export default function LoginForm() { { +const Markdown = ({ body, md, isReaction = false }) => { const members = useMemberStore((state) => state.members); const username = useUserStore((state) => state.username); const value = useMemo(() => ({ members, username }), [members, username]); @@ -23,12 +23,12 @@ const Markdown = ({ body, isReaction = false }) => { ); } - if (!body || !body.md) return <>; + if (!body || !md) return <>; return ( - + ); diff --git a/packages/react/src/views/Mentions/MembersList.styles.js b/packages/react/src/views/Mentions/MembersList.styles.js index e288cae04d..03bc8f4018 100644 --- a/packages/react/src/views/Mentions/MembersList.styles.js +++ b/packages/react/src/views/Mentions/MembersList.styles.js @@ -3,7 +3,7 @@ import { css } from '@emotion/react'; const getMemberListStyles = (theme) => { const styles = { main: css` - margin: 0.2rem 2rem; + margin: 0.2rem 0rem; display: block; overflow: auto; max-height: 10rem; diff --git a/packages/react/src/views/Message/BubbleVariant/Bubble.styles.js b/packages/react/src/views/Message/BubbleVariant/Bubble.styles.js index 42f978f9eb..3138692604 100644 --- a/packages/react/src/views/Message/BubbleVariant/Bubble.styles.js +++ b/packages/react/src/views/Message/BubbleVariant/Bubble.styles.js @@ -93,8 +93,13 @@ export const getBubbleStyles = (theme) => { border-radius: inherit; overflow: hidden; `, + fileAttachmentContainer: css` + border: 1px solid ${theme.colors.border}; + border-radius: inherit; + overflow: hidden; + `, pinnedContainer: css` - max-width: 80%; + max-width: 100%; `, quoteContainer: css` @@ -112,7 +117,7 @@ export const getBubbleStyles = (theme) => { `, attachmentMetaContainer: css` - padding: 2.5% 2.5% 0; + padding: 2.5% 0 0; `, emojiPickerStyles: css` @@ -172,7 +177,7 @@ export const getBubbleStylesMe = (theme) => { pinnedContainerMe: css` border-inline-start: none; - border-inline-end: 3px solid ${theme.colors.border}; + border-inline-end: none; `, textUserInfoMe: css` diff --git a/packages/react/src/views/Message/Message.js b/packages/react/src/views/Message/Message.js index 8ce3d8bf5c..367b2d852b 100644 --- a/packages/react/src/views/Message/Message.js +++ b/packages/react/src/views/Message/Message.js @@ -7,11 +7,13 @@ import { useComponentOverrides, appendClassNames, useTheme, + lighten, + darken, } from '@embeddedchat/ui-elements'; import { Attachments } from '../AttachmentHandler'; import { Markdown } from '../Markdown'; import MessageHeader from './MessageHeader'; -import { useMessageStore, useUserStore } from '../../store'; +import { useMessageStore, useUserStore, useSidebarStore } from '../../store'; import RCContext from '../../context/RCInstance'; import { MessageBody } from './MessageBody'; import { MessageReactions } from './MessageReactions'; @@ -24,6 +26,7 @@ import { LinkPreview } from '../LinkPreview'; import { getMessageStyles } from './Message.styles'; import useBubbleStyles from './BubbleVariant/useBubbleStyles'; import UiKitMessageBlock from './uiKit/UiKitMessageBlock'; +import useFetchChatData from '../../hooks/useFetchChatData'; const Message = ({ message, @@ -48,25 +51,61 @@ const Message = ({ const { RCInstance, ECOptions } = useContext(RCContext); showAvatar = ECOptions?.showAvatar && showAvatar; - + const { showSidebar, setShowSidebar } = useSidebarStore(); const authenticatedUserId = useUserStore((state) => state.userId); const authenticatedUserUsername = useUserStore((state) => state.username); + const userRoles = useUserStore((state) => state.roles); + const pinPermissions = useUserStore( + (state) => state.userPinPermissions.roles + ); + const editMessagePermissions = useMessageStore( + (state) => state.editMessagePermissions.roles + ); const [setMessageToReport, toggleShowReportMessage] = useMessageStore( (state) => [state.setMessageToReport, state.toggleShowReportMessage] ); - const setQuoteMessage = useMessageStore((state) => state.setQuoteMessage); + const addQuoteMessage = useMessageStore((state) => state.addQuoteMessage); const openThread = useMessageStore((state) => state.openThread); - + const { getStarredMessages, getPinnedMessages } = useFetchChatData(); const dispatchToastMessage = useToastBarDispatch(); const { editMessage, setEditMessage } = useMessageStore((state) => ({ editMessage: state.editMessage, setEditMessage: state.setEditMessage, })); + const deleteMessagePermissions = useMessageStore( + (state) => state.deleteMessageRoles.roles + ); + const deleteOwnMessagePermissions = useMessageStore( + (state) => state.deleteOwnMessageRoles.roles + ); + const forceDeleteMessagePermissions = useMessageStore( + (state) => state.forceDeleteMessageRoles.roles + ); const isMe = message.u._id === authenticatedUserId; + const theme = useTheme(); + const { mode } = useTheme(); const styles = getMessageStyles(theme); + const hasType = Boolean(message.t); + + const hoverStyle = hasType + ? {} + : { + '&:hover': { + backgroundColor: + mode === 'light' + ? darken(theme.theme.colors.background, 0.03) + : lighten(theme.theme.colors.background, 1), + }, + }; + const bubbleStyles = useBubbleStyles(isMe); + const pinRoles = new Set(pinPermissions); + const editMessageRoles = new Set(editMessagePermissions); + const deleteMessageRoles = new Set(deleteMessagePermissions); + const deleteOwnMessageRoles = new Set(deleteOwnMessagePermissions); + const forceDeleteMessageRoles = new Set(forceDeleteMessagePermissions); const variantStyles = !isInSidebar && variantOverrides === 'bubble' ? bubbleStyles : {}; @@ -87,14 +126,17 @@ const Message = ({ message: 'Message unstarred', }); } + getStarredMessages(); }; const handlePinMessage = async (msg) => { const isPinned = msg.pinned; + msg.pinned = !isPinned; const pinOrUnpin = isPinned ? await RCInstance.unpinMessage(msg._id) : await RCInstance.pinMessage(msg._id); if (pinOrUnpin.error) { + msg.pinned = isPinned; dispatchToastMessage({ type: 'error', message: 'Error pinning message', @@ -104,6 +146,50 @@ const Message = ({ type: 'success', message: isPinned ? 'Message unpinned' : 'Message pinned', }); + getPinnedMessages(); + } + }; + + const handleCopyMessage = async (msg) => { + const textToCopy = + msg.msg || + (msg.attachments && msg.attachments[0] + ? msg.attachments[0].description || msg.attachments[0].title + : ''); + + try { + await navigator.clipboard.writeText(textToCopy); + dispatchToastMessage({ + type: 'success', + message: 'Message copied successfully', + }); + } catch (error) { + dispatchToastMessage({ + type: 'error', + message: 'Error in copying message', + }); + } + }; + + const getMessageLink = async (id) => { + const host = await RCInstance.getHost(); + const res = await RCInstance.channelInfo(); + return `${host}/channel/${res.room.name}/?msg=${id}`; + }; + + const handleCopyMessageLink = async (msg) => { + try { + const messageLink = await getMessageLink(msg._id); + await navigator.clipboard.writeText(messageLink); + dispatchToastMessage({ + type: 'success', + message: 'Message link copied successfully', + }); + } catch (err) { + dispatchToastMessage({ + type: 'error', + message: 'Error in copying message link', + }); } }; @@ -121,6 +207,7 @@ const Message = ({ message: 'Error in deleting message', }); } + getStarredMessages(); }; const handleEmojiClick = async (e, msg, canReact) => { @@ -130,6 +217,7 @@ const Message = ({ const handleOpenThread = (msg) => async () => { openThread(msg); + setShowSidebar(false); }; const isStarred = message.starred?.find((u) => u._id === authenticatedUserId); @@ -138,10 +226,16 @@ const Message = ({ return ( <> + {newDay && ( + + {format(new Date(message.ts), 'MMMM d, yyyy')} + + )} )} - + {shouldShowHeader && ( {message.attachments && message.attachments.length > 0 ? ( <> - + ) : ( - + )} {message.blocks && ( @@ -200,6 +302,14 @@ const Message = ({ message={message} isEditing={editMessage._id === message._id} authenticatedUserId={authenticatedUserId} + userRoles={userRoles} + pinRoles={pinRoles} + deleteMessageRoles={deleteMessageRoles} + deleteOwnMessageRoles={deleteOwnMessageRoles} + forceDeleteMessageRoles={forceDeleteMessageRoles} + editMessageRoles={editMessageRoles} + handleCopyMessage={handleCopyMessage} + handleCopyMessageLink={handleCopyMessageLink} handleOpenThread={handleOpenThread} handleDeleteMessage={handleDeleteMessage} handleStarMessage={handleStarMessage} @@ -211,7 +321,7 @@ const Message = ({ setEditMessage(message); } }} - handleQuoteMessage={() => setQuoteMessage(message)} + handleQuoteMessage={() => addQuoteMessage(message)} handleEmojiClick={handleEmojiClick} handlerReportMessage={() => { setMessageToReport(message._id); @@ -267,11 +377,6 @@ const Message = ({ ) : null} - {newDay && ( - - {format(new Date(message.ts), 'MMMM d, yyyy')} - - )} ); }; diff --git a/packages/react/src/views/Message/Message.styles.js b/packages/react/src/views/Message/Message.styles.js index b6b978fb4c..03236addbd 100644 --- a/packages/react/src/views/Message/Message.styles.js +++ b/packages/react/src/views/Message/Message.styles.js @@ -1,7 +1,6 @@ import { css } from '@emotion/react'; -import { lighten, darken } from '@embeddedchat/ui-elements'; -export const getMessageStyles = ({ theme, mode }) => { +export const getMessageStyles = ({ theme }) => { const styles = { main: css` display: flex; @@ -12,11 +11,8 @@ export const getMessageStyles = ({ theme, mode }) => { padding-left: 2.25rem; padding-right: 2.25rem; color: ${theme.colors.foreground}; - - &:hover { - background-color: ${mode === 'light' - ? darken(theme.colors.background, 0.03) - : lighten(theme.colors.background, 1)}; + @media (max-width: 768px) { + padding-left: 0.8rem; } `, messageEditing: css` @@ -81,6 +77,9 @@ export const getMessageDividerStyles = (theme) => { margin-bottom: 0.75rem; padding-left: 1.25rem; padding-right: 1.25rem; + @media (max-width: 780px) { + z-index: 1; + } `, dividerContent: css` @@ -109,6 +108,58 @@ export const getMessageDividerStyles = (theme) => { return styles; }; +export const getUnreadMessageDividerStyles = (theme, mode) => { + // Use destructive (red) for light themes, warningForeground (orange) for dark themes + const dividerColor = + mode === 'light' + ? theme.colors.destructive + : theme.colors.warningForeground; + + const styles = { + divider: css` + letter-spacing: 0rem; + font-size: 0.75rem; + font-weight: 700; + line-height: 1rem; + position: relative; + display: flex; + z-index: 1000; + align-items: center; + margin-top: 0.5rem; + margin-bottom: 0.75rem; + padding-left: 1.25rem; + padding-right: 1.25rem; + @media (max-width: 780px) { + z-index: 1; + } + `, + + dividerContent: css` + margin-top: 0.5rem; + margin-bottom: 0.5rem; + padding-left: 0.5rem; + padding-right: 0.5rem; + background-color: ${theme.colors.background}; + color: ${dividerColor}; + position: absolute; + left: 50%; + transform: translateX(-50%); + border-radius: ${theme.radius}; + `, + + bar: css` + display: flex; + justify-content: flex-end; + align-items: center; + flex-grow: 1; + height: 1px; + background-color: ${dividerColor}; + `, + }; + + return styles; +}; + export const getMessageHeaderStyles = (theme) => { const styles = { header: css` @@ -128,10 +179,8 @@ export const getMessageHeaderStyles = (theme) => { font-size: 0.875rem; font-weight: 700; line-height: 1.25rem; - overflow: hidden; - text-overflow: ellipsis; white-space: nowrap; - flex-shrink: 1; + flex-shrink: 0; `, userName: css` @@ -140,10 +189,8 @@ export const getMessageHeaderStyles = (theme) => { letter-spacing: 0rem; font-size: 0.875rem; line-height: 1.25rem; - overflow: hidden; - text-overflow: ellipsis; white-space: nowrap; - flex-shrink: 1; + flex-shrink: 0; `, userRole: css` @@ -183,6 +230,12 @@ export const getMessageHeaderStyles = (theme) => { flex-shrink: 0; margin-left: 0.25rem; `, + messageStatus: css` + display: flex; + flex-flow: row nowrap; + align-items: center; + margin-left: 0.2rem; + `, }; return styles; @@ -204,7 +257,20 @@ export const MessageMetricsStyles = { display: flex; justify-content: center; align-items: center; - margin-left: ${isFirstMessage ? '0.5rem' : '0.25rem'}; + margin-left: ${isFirstMessage ? '0.5rem' : '0.3rem'}; + margin-top: 1.2px; + `, + + metricsAvatarItem: css` + letter-spacing: 0rem; + font-size: 0.625rem; + font-weight: 700; + line-height: 0.75rem; + display: flex; + justify-content: center; + align-items: center; + margin-left: 10px; + margin-top: 2px; `, metricsItemLabel: css` @@ -246,6 +312,22 @@ export const getMessageReactionsStyles = (theme) => { reactionMine: css` background: ${theme.colors.secondary}; `, + emojiTooltip: css` + position: absolute; + bottom: 120%; + left: 50%; + transform: translateX(-40%); + background-color: ${theme.invertedColors.secondary}; + color: ${theme.invertedColors.secondaryForeground}; + z-index: ${theme.zIndex?.tooltip || 1400}; + border-radius: ${theme.radius}; + padding: 8px 10px; + width: 200px; + white-space: normal; + overflow-wrap: break-word; + word-break: break-word; + font-size: 0.85rem; + `, }; return styles; diff --git a/packages/react/src/views/Message/MessageAvatarContainer.js b/packages/react/src/views/Message/MessageAvatarContainer.js index 7e7a8116ab..7fdf1b0b8a 100644 --- a/packages/react/src/views/Message/MessageAvatarContainer.js +++ b/packages/react/src/views/Message/MessageAvatarContainer.js @@ -43,7 +43,15 @@ const MessageAvatarContainer = ({ ) : null} @@ -52,6 +60,11 @@ const MessageAvatarContainer = ({ ) : null} + {message.editedAt && sequential ? ( + + + + ) : null} {isPinned && sequential ? ( diff --git a/packages/react/src/views/Message/MessageDivider.js b/packages/react/src/views/Message/MessageDivider.js index 617b7615cf..9c8f1c26bf 100644 --- a/packages/react/src/views/Message/MessageDivider.js +++ b/packages/react/src/views/Message/MessageDivider.js @@ -6,11 +6,15 @@ import { useTheme, } from '@embeddedchat/ui-elements'; -import { getMessageDividerStyles } from './Message.styles'; +import { + getMessageDividerStyles, + getUnreadMessageDividerStyles, +} from './Message.styles'; export const MessageDivider = ({ children, unreadLabel, + unread = false, className = '', style = {}, ...props @@ -20,8 +24,10 @@ export const MessageDivider = ({ className, style ); - const { theme } = useTheme(); - const styles = getMessageDividerStyles(theme); + const { theme, mode } = useTheme(); + const styles = unread + ? getUnreadMessageDividerStyles(theme, mode) + : getMessageDividerStyles(theme); return ( 0 ? message.msg : '(none)' + }`; + case 'room_changed_description': + return `changed room description to: ${ + message?.msg && message.msg.length > 0 ? message.msg : '(none)' + }`; + case 'room_changed_topic': + return `changed room topic to: ${ + message?.msg && message.msg.length > 0 ? message.msg : '(none)' + }`; + case 'r': + return `changed room name to ${ + message?.msg && message.msg.length > 0 ? message.msg : '(none)' + }`; + case 'user-converted-to-team': + return `converted #${ + message?.msg && message.msg.length > 0 ? message.msg : '(none)' + } to team`; + case 'user-converted-to-channel': + return `converted #${ + message?.msg && message.msg.length > 0 ? message.msg : '(none)' + } to channel`; default: return ''; } @@ -90,7 +116,9 @@ const MessageHeader = ({ : null } > - {message.u?.name} + {message.u?._id === 'rocket.cat' + ? message.u.username + : message.u.name} )} {showDisplayName && showUsername && ( @@ -115,7 +143,7 @@ const MessageHeader = ({ css={styles.userRole} className={appendClassNames('ec-message-user-role')} > - admin + Admin )} @@ -126,7 +154,7 @@ const MessageHeader = ({ css={styles.userRole} className={appendClassNames('ec-message-user-role')} > - {role} + {role.charAt(0).toUpperCase() + role.slice(1)} ))} @@ -137,6 +165,7 @@ const MessageHeader = ({ css={styles.userActions} className={appendClassNames('ec-message-header-useractions')} style={{ marginLeft: '2px' }} + title={userActions()} > {userActions()} diff --git a/packages/react/src/views/Message/MessageMetrics.js b/packages/react/src/views/Message/MessageMetrics.js index 07b7e40505..8bc366d71b 100644 --- a/packages/react/src/views/Message/MessageMetrics.js +++ b/packages/react/src/views/Message/MessageMetrics.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { formatDistance } from 'date-fns'; import { Box, @@ -6,8 +6,12 @@ import { Icon, useComponentOverrides, appendClassNames, + Avatar, + Tooltip, } from '@embeddedchat/ui-elements'; import { MessageMetricsStyles as styles } from './Message.styles'; +import RCContext from '../../context/RCInstance'; + import BubbleThreadBtn from './BubbleVariant/BubbleThreadBtn'; export const MessageMetrics = ({ @@ -25,6 +29,18 @@ export const MessageMetrics = ({ style ); + const { RCInstance } = useContext(RCContext); + + const getUserAvatarUrl = (username) => { + const host = RCInstance.getHost(); + return `${host}/avatar/${username}`; + }; + + const participantsList = + (message?.replies?.length ?? 0) - 1 > 0 + ? `+${message.replies.length - 1}` + : null; + return ( - Reply + View thread - - - {message.tcount} - {!!message.tcount && ( - - - - {message.replies.length} - - + <> + + + + {participantsList && ( + + {participantsList} + + )} + + + )} - - - - {formatDistance(new Date(message.tlm), new Date(), { - addSuffix: true, - })} + + + + {message.tcount} replies,{' '} + {new Date(message.tlm).toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + hour12: false, + })} + - + ))} diff --git a/packages/react/src/views/Message/MessageReactions.js b/packages/react/src/views/Message/MessageReactions.js index 5f05a684d0..39a0cc6f96 100644 --- a/packages/react/src/views/Message/MessageReactions.js +++ b/packages/react/src/views/Message/MessageReactions.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState, useMemo } from 'react'; import { Box, useComponentOverrides, @@ -24,6 +24,44 @@ export const MessageReactions = ({ ); const { theme } = useTheme(); const styles = getMessageReactionsStyles(theme); + const [hoveredReaction, setHoveredReaction] = useState(null); + + const tooltipMap = useMemo(() => { + const map = {}; + if (message.reactions) { + serializeReactions(message.reactions).forEach((reaction) => { + const usernames = reaction.usernames || []; + const updatedUsernames = []; + let isUserIncluded = false; + + usernames.forEach((username) => { + if (username === authenticatedUserUsername) { + isUserIncluded = true; + } else { + updatedUsernames.push(username); + } + }); + + if (isUserIncluded) { + updatedUsernames.unshift('You'); + } + + const visibleNames = updatedUsernames.slice(0, 9); + const remainingCount = updatedUsernames.length - visibleNames.length; + + let tooltipContent = visibleNames.join(', '); + if (remainingCount > 0) { + tooltipContent += `, and ${remainingCount} ${ + remainingCount === 1 ? 'other' : 'others' + }`; + } + + map[reaction.name] = `${tooltipContent} reacted with ${reaction.name}`; + }); + } + return map; + }, [message.reactions, authenticatedUserUsername]); + return ( {message.reactions && - serializeReactions(message.reactions).map((reaction) => ( - - handleEmojiClick( - reaction, - message, - !isSameUser(reaction, authenticatedUserUsername) - ) - } - > - -

{reaction.count}

-
- ))} + serializeReactions(message.reactions).map((reaction) => { + const isUserReaction = isSameUser( + reaction, + authenticatedUserUsername + ); + return ( + + handleEmojiClick(reaction, message, !isUserReaction) + } + onMouseEnter={() => setHoveredReaction(reaction.name)} + onMouseLeave={() => setHoveredReaction(null)} + style={{ position: 'relative' }} + > + +

{reaction.count}

+ {hoveredReaction === reaction.name && ( + {tooltipMap[reaction.name]} + )} +
+ ); + })}
); }; diff --git a/packages/react/src/views/Message/MessageToolbox.js b/packages/react/src/views/Message/MessageToolbox.js index 248dd35586..e530a458a1 100644 --- a/packages/react/src/views/Message/MessageToolbox.js +++ b/packages/react/src/views/Message/MessageToolbox.js @@ -1,4 +1,4 @@ -import React, { useState, useMemo } from 'react'; +import React, { useState, useContext, useMemo } from 'react'; import { Box, Modal, @@ -9,10 +9,12 @@ import { appendClassNames, useTheme, } from '@embeddedchat/ui-elements'; +import RCContext from '../../context/RCInstance'; import { EmojiPicker } from '../EmojiPicker'; -import { parseEmoji } from '../../lib/emoji'; import { getMessageToolboxStyles } from './Message.styles'; import SurfaceMenu from '../SurfaceMenu/SurfaceMenu'; +import { Markdown } from '../Markdown'; +import Attachment from '../AttachmentHandler/Attachment'; export const MessageToolbox = ({ className = '', @@ -21,12 +23,20 @@ export const MessageToolbox = ({ style = {}, isThreadMessage = false, authenticatedUserId, + userRoles, + pinRoles, + deleteMessageRoles, + deleteOwnMessageRoles, + forceDeleteMessageRoles, + editMessageRoles, handleOpenThread, handleEmojiClick, handlePinMessage, handleStarMessage, handleDeleteMessage, handlerReportMessage, + handleCopyMessage, + handleCopyMessageLink, handleEditMessage, handleQuoteMessage, isEditing = false, @@ -36,6 +46,8 @@ export const MessageToolbox = ({ 'reply', 'quote', 'star', + 'copy', + 'link', 'pin', 'edit', 'delete', @@ -52,6 +64,8 @@ export const MessageToolbox = ({ className, style ); + const { RCInstance } = useContext(RCContext); + const instanceHost = RCInstance.getHost(); const { theme } = useTheme(); const styles = getMessageToolboxStyles(theme); const surfaceItems = @@ -67,6 +81,38 @@ export const MessageToolbox = ({ setShowDeleteModal(false); }; + const isAllowedToPin = userRoles.some((role) => pinRoles.has(role)); + + const isAllowedToReport = message.u._id !== authenticatedUserId; + + const isAllowedToEditMessage = userRoles.some((role) => + editMessageRoles.has(role) + ) + ? true + : message.u._id === authenticatedUserId; + + const isAllowedToDeleteMessage = userRoles.some((role) => + deleteMessageRoles.has(role) + ); + const isAllowedToDeleteOwnMessage = userRoles.some((role) => + deleteOwnMessageRoles.has(role) + ); + const isAllowedToForceDeleteMessage = userRoles.some((role) => + forceDeleteMessageRoles.has(role) + ); + + const isVisibleForMessageType = + message.files?.[0].type !== 'audio/mpeg' && + message.files?.[0].type !== 'video/mp4'; + + const canDeleteMessage = isAllowedToForceDeleteMessage + ? true + : isAllowedToDeleteMessage + ? true + : isAllowedToDeleteOwnMessage + ? message.u._id === authenticatedUserId + : false; + const options = useMemo( () => ({ reply: { @@ -110,23 +156,37 @@ export const MessageToolbox = ({ id: 'pin', onClick: () => handlePinMessage(message), iconName: message.pinned ? 'pin-filled' : 'pin', - visible: !isThreadMessage, + visible: isAllowedToPin, }, edit: { label: 'Edit', id: 'edit', onClick: () => handleEditMessage(message), iconName: 'edit', - visible: message.u._id === authenticatedUserId, + visible: isAllowedToEditMessage, color: isEditing ? 'secondary' : 'default', ghost: !isEditing, }, + copy: { + label: 'Copy message', + id: 'copy', + onClick: () => handleCopyMessage(message), + iconName: 'copy', + visible: true, + }, + link: { + label: 'Copy link', + id: 'link', + onClick: () => handleCopyMessageLink(message), + iconName: 'link', + visible: true, + }, delete: { label: 'Delete', id: 'delete', onClick: () => setShowDeleteModal(true), iconName: 'trash', - visible: message.u._id === authenticatedUserId, + visible: canDeleteMessage, type: 'destructive', }, report: { @@ -134,7 +194,7 @@ export const MessageToolbox = ({ id: 'report', onClick: () => handlerReportMessage(message), iconName: 'report', - visible: true, + visible: isAllowedToReport, type: 'destructive', }, }), @@ -149,6 +209,8 @@ export const MessageToolbox = ({ handlePinMessage, handleEditMessage, handlerReportMessage, + handleCopyMessage, + isAllowedToPin, ] ); @@ -234,13 +296,73 @@ export const MessageToolbox = ({ - {parseEmoji(message.msg)} + {message.file ? ( + message.file.type.startsWith('image/') ? ( +
+ {message.file.name} +
{`${message.file.name} (${( + message.file.size / 1024 + ).toFixed(2)} kB)`}
+
+ ) : message.file.type.startsWith('video/') ? ( + + ) : message.file.type.startsWith('audio/') ? ( + + ) : ( + + ) + ) : ( + + )} + {message.attachments && + message.attachments.length > 0 && + message.msg && + message.msg[0] === '[' && + message.attachments.map((attachment, index) => ( + + ))}
- - + + + + {messageDescription(message)} + + {children} + + + + + + + + ); }; diff --git a/packages/react/src/views/RoomInformation/RoomInformation.js b/packages/react/src/views/RoomInformation/RoomInformation.js index 504b0f4ba8..3008d46c1f 100644 --- a/packages/react/src/views/RoomInformation/RoomInformation.js +++ b/packages/react/src/views/RoomInformation/RoomInformation.js @@ -6,15 +6,19 @@ import { Sidebar, Popup, useComponentOverrides, + Icon, + useTheme, } from '@embeddedchat/ui-elements'; import RCContext from '../../context/RCInstance'; import { useChannelStore } from '../../store'; +import getRoomInformationStyles from './RoomInformation.styles'; import useSetExclusiveState from '../../hooks/useSetExclusiveState'; const Roominfo = () => { - const { RCInstance } = useContext(RCContext); - + const { RCInstance, ECOptions } = useContext(RCContext); const channelInfo = useChannelStore((state) => state.channelInfo); + const isChannelPrivate = useChannelStore((state) => state.isChannelPrivate); + const isRoomTeam = useChannelStore((state) => state.isRoomTeam); const { variantOverrides } = useComponentOverrides('RoomMember'); const viewType = variantOverrides.viewType || 'Sidebar'; const setExclusiveState = useSetExclusiveState(); @@ -22,14 +26,17 @@ const Roominfo = () => { const host = RCInstance.getHost(); return `${host}/avatar/${channelname}`; }; - + const { channelName } = ECOptions ?? {}; const ViewComponent = viewType === 'Popup' ? Popup : Sidebar; + const { theme, mode } = useTheme(); + const styles = getRoomInformationStyles(theme, mode); return ( setExclusiveState(null)} + style={{ width: '400px', zIndex: window.innerWidth <= 780 ? 1 : null }} {...(viewType === 'Popup' ? { isPopupHeader: true, @@ -43,34 +50,62 @@ const Roominfo = () => { overflow: auto; `} > - - - # {channelInfo.name} - - - Description + + + + + + Room Archived - - {channelInfo.description} + + + {channelInfo.name || channelName} + {channelInfo.description && ( + <> + Description + {channelInfo.description} + + )} + {channelInfo.announcement && ( + <> + Announcement + {channelInfo.announcement} + + )} + {channelInfo.topic && ( + <> + Topic + {channelInfo.topic} + + )} diff --git a/packages/react/src/views/RoomInformation/RoomInformation.styles.js b/packages/react/src/views/RoomInformation/RoomInformation.styles.js new file mode 100644 index 0000000000..b77233120a --- /dev/null +++ b/packages/react/src/views/RoomInformation/RoomInformation.styles.js @@ -0,0 +1,43 @@ +import { css } from '@emotion/react'; + +const getRoomInformationStyles = (theme, mode) => { + const styles = { + infoContainer: css` + margin: 16px; + display: flex; + flex-direction: column; + gap: 0.1rem; + `, + infoHeader: css` + margin-block: 5px; + font-weight: 900; + `, + info: css` + word-wrap: break-word; + overflow-wrap: anywhere; + white-space: normal; + opacity: 0.7; + font-size: 0.9rem; + `, + + archivedRoomInfo: css` + display: flex; + border: 1px solid + ${mode === 'light' + ? theme.colors.warning + : theme.colors.warningForeground}; + border-radius: ${theme.radius}; + padding: 0.75rem 1rem; + width: 100%; + gap: 0.75rem; + margin-bottom: 1rem; + `, + archivedText: css` + font-size: 1rem; + `, + }; + + return styles; +}; + +export default getRoomInformationStyles; diff --git a/packages/react/src/views/RoomMembers/RoomMember.js b/packages/react/src/views/RoomMembers/RoomMember.js index c52f48c9dd..27a97278fc 100644 --- a/packages/react/src/views/RoomMembers/RoomMember.js +++ b/packages/react/src/views/RoomMembers/RoomMember.js @@ -5,10 +5,14 @@ import { Button, Icon, Sidebar, + Input, Popup, + StaticSelect, + Divider, useComponentOverrides, useTheme, } from '@embeddedchat/ui-elements'; +import { css } from '@emotion/react'; import RoomMemberItem from './RoomMemberItem'; import RCContext, { useRCContext } from '../../context/RCInstance'; import useInviteStore from '../../store/inviteStore'; @@ -33,6 +37,11 @@ const RoomMembers = ({ members }) => { const [userInfo, setUserInfo] = useState(null); const setExclusiveState = useSetExclusiveState(); + const [searchTerm, setSearchTerm] = useState(''); + const [filteredMembers, setFilteredMembers] = useState(members); + + const [viewStatus, setViewStatus] = useState('All'); + useEffect(() => { const getUserInfo = async () => { try { @@ -47,14 +56,39 @@ const RoomMembers = ({ members }) => { getUserInfo(); }, [RCInstance]); + useEffect(() => { + const filtered = members.filter((member) => { + if (viewStatus === 'Online') { + return member.status === 'online'; + } + return true; + }); + + setFilteredMembers( + filtered.filter( + (member) => + member.name?.toLowerCase().includes(searchTerm.toLowerCase()) || + member.username?.toLowerCase().includes(searchTerm.toLowerCase()) + ) + ); + }, [viewStatus, searchTerm, members]); + const roles = userInfo && userInfo.roles ? userInfo.roles : []; const isAdmin = roles.includes('admin'); const ViewComponent = viewType === 'Popup' ? Popup : Sidebar; + + const handleSelect = (value) => { + setViewStatus(value); + }; + + const displayedMembers = filteredMembers.length; + return ( setExclusiveState(null)} + style={{ width: '400px', zIndex: window.innerWidth <= 780 ? 1 : null }} {...(viewType === 'Popup' ? { isPopupHeader: true, @@ -69,13 +103,13 @@ const RoomMembers = ({ members }) => { ) : ( <> - {members.map((member) => ( - - ))} - {isAdmin && ( )} + + + setSearchTerm(e.target.value)} + placeholder="Search members" + /> + + + + + + + + + + + + + Showing {displayedMembers} of {displayedMembers} + + + {filteredMembers.length > 0 ? ( + filteredMembers.map((member) => ( + + )) + ) : ( + No members found + )} + )}
@@ -90,6 +186,7 @@ const RoomMembers = ({ members }) => { ); }; + export default RoomMembers; RoomMembers.propTypes = { diff --git a/packages/react/src/views/RoomMembers/RoomMemberItem.js b/packages/react/src/views/RoomMembers/RoomMemberItem.js index 336dc7ae95..d53632782d 100644 --- a/packages/react/src/views/RoomMembers/RoomMemberItem.js +++ b/packages/react/src/views/RoomMembers/RoomMemberItem.js @@ -1,32 +1,33 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import { css } from '@emotion/react'; -import { Box, Icon, Avatar } from '@embeddedchat/ui-elements'; -import RCContext from '../../context/RCInstance'; -import { RoomMemberItemStyles as styles } from './RoomMembers.styles'; +import { Box, Icon, Avatar, useTheme } from '@embeddedchat/ui-elements'; +import { RoomMemberItemStyles } from './RoomMembers.styles'; +import useSetExclusiveState from '../../hooks/useSetExclusiveState'; +import { useUserStore } from '../../store'; -const RoomMemberItem = ({ user, host }) => { - const { RCInstance } = useContext(RCContext); - const [userStatus, setUserStatus] = useState(''); +const RoomMemberItem = ({ user, host, userStatus }) => { const avatarUrl = new URL(`avatar/${user.username}`, host).toString(); + const { theme } = useTheme(); + const { mode } = useTheme(); + const styles = RoomMemberItemStyles(theme, mode); - useEffect(() => { - const getStatus = async () => { - try { - const res = await RCInstance.getUserStatus(user._id); - if (res.success) { - setUserStatus(res.status); - } - } catch (err) { - console.error('Error fetching user status', err); - } - }; - - getStatus(); - }, [RCInstance]); + const setExclusiveState = useSetExclusiveState(); + const { setShowCurrentUserInfo, setCurrentUser } = useUserStore((state) => ({ + setShowCurrentUserInfo: state.setShowCurrentUserInfo, + setCurrentUser: state.setCurrentUser, + })); + const handleShowUserInfo = () => { + setExclusiveState(setShowCurrentUserInfo); + setCurrentUser(user); + }; return ( - + { {userStatus && ( )} - {user.username} + + {user.name} ({user.username}) + ); diff --git a/packages/react/src/views/RoomMembers/RoomMembers.styles.js b/packages/react/src/views/RoomMembers/RoomMembers.styles.js index 68d3307f5a..1ff0181b7f 100644 --- a/packages/react/src/views/RoomMembers/RoomMembers.styles.js +++ b/packages/react/src/views/RoomMembers/RoomMembers.styles.js @@ -1,34 +1,84 @@ import { css } from '@emotion/react'; +import { lighten, darken } from '@embeddedchat/ui-elements'; -export const getRoomMemberStyles = () => { +export const getRoomMemberStyles = (theme) => { const styles = { container: css` display: flex; flex-direction: column; - overflow: auto; + height: 100%; width: 100%; - justify-content: center; padding: 0 1rem 1rem; + box-sizing: border-box; + `, + searchContainer: css` + display: flex; + align-items: center; + justify-content: space-between; + border: 1px solid ${theme.colors.border}; + padding: 0 0.5rem; + border-radius: ${theme.radius}; + position: relative; + width: 60%; + `, + filterContainer: css` + width: 40%; + margin-left: 0.5rem; + border-radius: ${theme.radius}; + position: relative; + `, + textInput: css` + flex: 1; + border: none; + padding: none; + font-size: 1rem; + &:focus { + outline: none; + } + `, + searchIcon: css` + padding-left: 0.5rem; + font-size: 1.25rem; + color: ${theme.colors.icon}; + `, + memberList: css` + flex: 1; + overflow-y: auto; + margin-top: 1rem; + `, + noMembers: css` + text-align: center; + color: ${theme.colors.textSecondary}; + margin-top: 1rem; `, }; return styles; }; -export const RoomMemberItemStyles = { - container: css` - width: 100%; - padding-bottom: 8px; - padding-top: 8px; - display: flex; - align-items: center; - `, +export const RoomMemberItemStyles = (theme, mode) => { + const styles = { + container: css` + width: 100%; + padding-bottom: 8px; + padding-top: 8px; + display: flex; + align-items: center; - icon: css` - padding: 0.125em; - margin-right: 0.5rem; - align-self: center; - `, + &:hover { + background-color: ${mode === 'light' + ? darken(theme.colors.background, 0.03) + : lighten(theme.colors.background, 1)}; + } + `, + + icon: css` + padding: 0.125em; + margin-right: 0.5rem; + align-self: center; + `, + }; + return styles; }; export const InviteMemberStyles = { diff --git a/packages/react/src/views/SurfaceMenu/SurfaceItem.js b/packages/react/src/views/SurfaceMenu/SurfaceItem.js index 9674ead1cf..f9f061b8b8 100644 --- a/packages/react/src/views/SurfaceMenu/SurfaceItem.js +++ b/packages/react/src/views/SurfaceMenu/SurfaceItem.js @@ -2,7 +2,7 @@ import React from 'react'; import { Tooltip, ActionButton } from '@embeddedchat/ui-elements'; const SurfaceItem = ({ item, size }) => ( - + { const isMessageNewDay = (current, previous) => !previous || !isSameDay(new Date(current.ts), new Date(previous.ts)); + + const sortedMessages = [...(threadMessages || []), threadMainMessage] + .filter(Boolean) + .sort((a, b) => new Date(a.ts) - new Date(b.ts)); + return ( <> - {threadMessages?.concat(threadMainMessage).map((msg, index, arr) => { - const prev = arr[index + 1]; - const next = arr[index - 1]; + {sortedMessages.map((msg, index, arr) => { + const prev = arr[index - 1]; + const next = arr[index + 1]; const newDay = isMessageNewDay(msg, prev); const sequential = isMessageSequential(msg, prev, 300); const lastSequential = sequential && isMessageLastSequential(msg, next); return ( - msg && ( - - ) + ); })} {showReportMessage && } diff --git a/packages/react/src/views/UserInformation/UserInformation.js b/packages/react/src/views/UserInformation/UserInformation.js index d745ee9b7f..a544bd334b 100644 --- a/packages/react/src/views/UserInformation/UserInformation.js +++ b/packages/react/src/views/UserInformation/UserInformation.js @@ -1,5 +1,6 @@ import React, { useContext, useEffect, useState } from 'react'; import { css } from '@emotion/react'; +import { parse } from '@rocket.chat/message-parser'; import { Box, Sidebar, @@ -14,9 +15,11 @@ import { import RCContext from '../../context/RCInstance'; import { useUserStore } from '../../store'; import formatTimestamp from '../../lib/formatTimestamp'; +import formatTimestampGetDate from '../../lib/formatTimestampGetDate'; import UserInfoField from './UserInfoField'; import getUserInformationStyles from './UserInformation.styles'; import useSetExclusiveState from '../../hooks/useSetExclusiveState'; +import { Markdown } from '../Markdown'; const UserInformation = () => { const { variantOverrides } = useComponentOverrides('UserInformation'); @@ -24,13 +27,20 @@ const UserInformation = () => { const setExclusiveState = useSetExclusiveState(); const { RCInstance } = useContext(RCContext); const { theme } = useTheme(); + const { mode } = useTheme(); const styles = getUserInformationStyles(theme); const [currentUserInfo, setCurrentUserInfo] = useState({}); const [isUserInfoFetched, setIsUserInfoFetched] = useState(false); const currentUser = useUserStore((state) => state.currentUser); - const authenticatedUserRoles = useUserStore((state) => state.roles); + const currentUserRoles = useUserStore((state) => state.roles); + const viewUserFullInfoRoles = useUserStore( + (state) => state.viewUserInfoPermissions.roles + ); const authenticatedUserId = useUserStore((state) => state.userId); - const isAdmin = authenticatedUserRoles?.includes('admin'); + const viewInfoRoles = new Set(viewUserFullInfoRoles); + const isAllowedToViewFullInfo = currentUserRoles.some((role) => + viewInfoRoles.has(role) + ); const getUserAvatarUrl = (username) => { const host = RCInstance.getHost(); return `${host}/avatar/${username}`; @@ -39,7 +49,7 @@ const UserInformation = () => { useEffect(() => { const getCurrentUserInfo = async () => { try { - const res = await RCInstance.userInfo(currentUser._id); + const res = await RCInstance.userData(currentUser.username); if (res?.user) { setCurrentUserInfo(res.user); setIsUserInfoFetched(true); @@ -50,7 +60,7 @@ const UserInformation = () => { }; getCurrentUserInfo(); - }, [RCInstance, setCurrentUserInfo]); + }, [RCInstance, currentUser]); const ViewComponent = viewType === 'Popup' ? Popup : Sidebar; @@ -59,6 +69,10 @@ const UserInformation = () => { title="User Info" iconName="user" onClose={() => setExclusiveState(null)} + style={{ + width: '400px', + zIndex: window.innerWidth <= 780 ? 1 : null, + }} {...(viewType === 'Popup' ? { isPopupHeader: true, @@ -92,6 +106,24 @@ const UserInformation = () => { /> {currentUserInfo?.username}
+ {currentUserInfo?.statusText && ( + + {currentUserInfo?.statusText} + + )} + {currentUserInfo?.nickname && ( + + )} {currentUserInfo?.roles?.length && ( { css={styles.userRole} className={appendClassNames('ec-message-user-role')} > - {role === 'admin' ? 'admin' : role} + {role === 'admin' + ? 'Admin' + : role === 'user' + ? 'user' + : role.charAt(0).toUpperCase() + role.slice(1)}
))} } - isAdmin={isAdmin} + isAdmin={isAllowedToViewFullInfo} authenticatedUserId={authenticatedUserId} currentUserInfo={currentUserInfo} /> @@ -117,31 +153,55 @@ const UserInformation = () => { + {currentUserInfo?.bio && ( + + } + isAdmin={isAllowedToViewFullInfo} + authenticatedUserId={authenticatedUserId} + currentUserInfo={currentUserInfo} + /> + )} ( {email.address} @@ -150,14 +210,14 @@ const UserInformation = () => { ))} - isAdmin={isAdmin} + isAdmin={isAllowedToViewFullInfo} authenticatedUserId={authenticatedUserId} currentUserInfo={currentUserInfo} /> diff --git a/packages/ui-elements/.storybook/main.js b/packages/ui-elements/.storybook/main.js index 7c981da605..0db593a3da 100644 --- a/packages/ui-elements/.storybook/main.js +++ b/packages/ui-elements/.storybook/main.js @@ -5,15 +5,7 @@ const config = { '@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-interactions', - { - name: '@storybook/addon-styling', - options: { - sass: { - // Require your Sass preprocessor here - implementation: require('sass'), - }, - }, - }, + '@storybook/addon-webpack5-compiler-babel', ], framework: { name: '@storybook/react-webpack5', diff --git a/packages/ui-elements/package.json b/packages/ui-elements/package.json index f3f7bfe256..e08f04fb6f 100644 --- a/packages/ui-elements/package.json +++ b/packages/ui-elements/package.json @@ -38,14 +38,14 @@ "@rollup/plugin-commonjs": "^21.0.2", "@rollup/plugin-node-resolve": "^13.1.3", "@rollup/plugin-replace": "^5.0.2", - "@storybook/addon-essentials": "^7.0.26", - "@storybook/addon-interactions": "^7.0.26", - "@storybook/addon-links": "^7.0.26", - "@storybook/addon-styling": "^1.3.6", - "@storybook/blocks": "^7.0.26", - "@storybook/react": "^7.0.26", - "@storybook/react-webpack5": "^7.0.26", - "@storybook/testing-library": "^0.2.0", + "@storybook/addon-essentials": "^8.6.18", + "@storybook/addon-interactions": "^8.6.18", + "@storybook/addon-links": "^8.6.18", + "@storybook/addon-webpack5-compiler-babel": "~3.0.0", + "@storybook/blocks": "^8.6.18", + "@storybook/react": "^8.6.18", + "@storybook/react-webpack5": "^8.6.18", + "@storybook/test": "^8.6.18", "@testing-library/react": "^12.1.4", "babel-jest": "^27.5.1", "concurrently": "^7.2.0", @@ -66,8 +66,8 @@ "lint-staged": "^12.4.2", "npm-run-all": "^4.1.5", "prettier": "^2.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^5.0.1", "rollup": "^2.70.1", "rollup-plugin-analyzer": "^4.0.0", @@ -77,12 +77,12 @@ "rollup-plugin-terser": "^7.0.2", "sass": "^1.66.1", "schedule": "^0.4.0", - "storybook": "^7.0.26", + "storybook": "^8.6.18", "typescript": "^5.5.3" }, "peerDependencies": { - "react": ">=17.0.2 <19.0.0", - "react-dom": ">=17.0.2 <19.0.0" + "react": ">=19.0.0 <20.0.0", + "react-dom": ">=19.0.0 <20.0.0" }, "dependencies": { "@emotion/babel-preset-css-prop": "^11.11.0", diff --git a/packages/ui-elements/src/components/Button/Button.styles.js b/packages/ui-elements/src/components/Button/Button.styles.js index fac0bced14..38b54ea21a 100644 --- a/packages/ui-elements/src/components/Button/Button.styles.js +++ b/packages/ui-elements/src/components/Button/Button.styles.js @@ -14,7 +14,9 @@ const getButtonStyles = (theme) => { const styles = { main: (type, size) => css` cursor: pointer; - display: inline-block; + display: inline-flex; + justify-content: center; + align-items: center; background-color: ${theme.colors[type] || 'currentColor'}; color: ${theme.colors[`${type}Foreground`] || 'currentColor'}; border: none; @@ -63,9 +65,6 @@ const getButtonStyles = (theme) => { min-width: ${getSquareSize(size)}; height: ${getSquareSize(size)}; padding: 0; - display: flex; - justify-content: center; - align-items: center; flex-shrink: 0; } diff --git a/packages/ui-elements/src/components/Icon/icons/HashLock.js b/packages/ui-elements/src/components/Icon/icons/HashLock.js new file mode 100644 index 0000000000..d44f815849 --- /dev/null +++ b/packages/ui-elements/src/components/Icon/icons/HashLock.js @@ -0,0 +1,16 @@ +import React from 'react'; + +const HashLock = (props) => ( + + + + +); + +export default HashLock; diff --git a/packages/ui-elements/src/components/Icon/icons/Lock.js b/packages/ui-elements/src/components/Icon/icons/Lock.js new file mode 100644 index 0000000000..00c234f3a5 --- /dev/null +++ b/packages/ui-elements/src/components/Icon/icons/Lock.js @@ -0,0 +1,15 @@ +import React from 'react'; + +const Lock = (props) => ( + + + +); + +export default Lock; diff --git a/packages/ui-elements/src/components/Icon/icons/Record.js b/packages/ui-elements/src/components/Icon/icons/Record.js new file mode 100644 index 0000000000..aa5480cc23 --- /dev/null +++ b/packages/ui-elements/src/components/Icon/icons/Record.js @@ -0,0 +1,25 @@ +import React from 'react'; + +const Record = (props) => ( + + + + +); + +export default Record; diff --git a/packages/ui-elements/src/components/Icon/icons/StopRecord.js b/packages/ui-elements/src/components/Icon/icons/StopRecord.js new file mode 100644 index 0000000000..c4adda4cd2 --- /dev/null +++ b/packages/ui-elements/src/components/Icon/icons/StopRecord.js @@ -0,0 +1,25 @@ +import React from 'react'; + +const StopRecord = (props) => ( + + + + +); + +export default StopRecord; diff --git a/packages/ui-elements/src/components/Icon/icons/Team.js b/packages/ui-elements/src/components/Icon/icons/Team.js new file mode 100644 index 0000000000..4602e9703c --- /dev/null +++ b/packages/ui-elements/src/components/Icon/icons/Team.js @@ -0,0 +1,15 @@ +import React from 'react'; + +const Team = (props) => ( + + + +); + +export default Team; diff --git a/packages/ui-elements/src/components/Icon/icons/index.js b/packages/ui-elements/src/components/Icon/icons/index.js index 77cd6a4511..1f416a020a 100644 --- a/packages/ui-elements/src/components/Icon/icons/index.js +++ b/packages/ui-elements/src/components/Icon/icons/index.js @@ -4,6 +4,8 @@ import Star from './Star'; import Pin from './Pin'; import ReplyDirectly from './ReplyDirectly'; import Hash from './Hash'; +import HashLock from './HashLock'; +import Lock from './Lock'; import Computer from './Computer'; import Cross from './Cross'; import Mic from './Mic'; @@ -35,6 +37,8 @@ import Kebab from './Kebab'; import Check from './Check'; import ErrorCircle from './ErrorCircle'; import ArrowDown from './ArrowDown'; +import Record from './Record'; +import StopRecord from './StopRecord'; import PinFilled from './PinFilled'; import VideoRecorder from './VideoRecoder'; import DisabledRecorder from './DisableRecorder'; @@ -61,6 +65,7 @@ import Arc from './Arc'; import Avatar from './Avatar'; import FormatText from './FormatText'; import Cog from './Cog'; +import Team from './Team'; const icons = { file: File, @@ -69,9 +74,12 @@ const icons = { pin: Pin, 'reply-directly': ReplyDirectly, hash: Hash, + hash_lock: HashLock, + lock: Lock, computer: Computer, cross: Cross, copy: Copy, + team: Team, mic: Mic, 'video-recorder': VideoRecorder, 'disabled-recorder': DisabledRecorder, @@ -103,6 +111,8 @@ const icons = { check: Check, 'error-circle': ErrorCircle, 'arrow-down': ArrowDown, + record: Record, + 'stop-record': StopRecord, 'pin-filled': PinFilled, clipboard: Clipboard, clip: Clip, diff --git a/packages/ui-elements/src/components/Modal/Modal.js b/packages/ui-elements/src/components/Modal/Modal.js index 99ee428439..f1ee37b983 100644 --- a/packages/ui-elements/src/components/Modal/Modal.js +++ b/packages/ui-elements/src/components/Modal/Modal.js @@ -72,4 +72,4 @@ export const Modal = forwardRef( } ); -Modal.displayName = Modal; +Modal.displayName = 'Modal'; diff --git a/packages/ui-elements/src/components/Sidebar/Sidebar.js b/packages/ui-elements/src/components/Sidebar/Sidebar.js index 8c8ec70928..cd9e7a1f73 100644 --- a/packages/ui-elements/src/components/Sidebar/Sidebar.js +++ b/packages/ui-elements/src/components/Sidebar/Sidebar.js @@ -11,6 +11,7 @@ const Sidebar = ({ iconName, onClose, children, + filterProps = {}, searchProps = {}, footer, style = {}, @@ -26,7 +27,9 @@ const Sidebar = ({ style={{ ...style, ...styleOverrides }} > - {children} + + {children} + {footer && {footer}} ); diff --git a/packages/ui-elements/src/components/Sidebar/Sidebar.styles.js b/packages/ui-elements/src/components/Sidebar/Sidebar.styles.js index 4c85b5b0f0..f6843a9105 100644 --- a/packages/ui-elements/src/components/Sidebar/Sidebar.styles.js +++ b/packages/ui-elements/src/components/Sidebar/Sidebar.styles.js @@ -34,11 +34,16 @@ export const getSidebarContentStyles = (theme) => { padding: 0 0.5rem; border-radius: ${theme.radius}; position: relative; - margin: 0 1rem 1rem; &.focused { outline: 1px solid ${theme.colors.ring}; } `, + filesHeader: css` + display: flex; + align-items: center; + justify-content: space-between; + margin: 1px 1rem 0; + `, textInput: css` border: none; diff --git a/packages/ui-elements/src/components/Sidebar/SidebarContent.js b/packages/ui-elements/src/components/Sidebar/SidebarContent.js index 7e8756f87a..cbe19088b7 100644 --- a/packages/ui-elements/src/components/Sidebar/SidebarContent.js +++ b/packages/ui-elements/src/components/Sidebar/SidebarContent.js @@ -4,13 +4,20 @@ import { Icon } from '../Icon'; import { Input } from '../Input'; import { getSidebarContentStyles } from './Sidebar.styles'; import { useTheme } from '../../hooks'; +import { StaticSelect } from '../StaticSelect'; -const SidebarContent = ({ children, searchProps = {}, style }) => { +const SidebarContent = ({ + children, + searchProps = {}, + style, + filterProps = {}, +}) => { const { isSearch = false, handleInputChange, placeholder, } = searchProps || {}; + const { isFile, options, value, handleFilterSelect } = filterProps || {}; const searchContainerRef = useRef(null); const { theme } = useTheme(); const styles = getSidebarContentStyles(theme); @@ -29,25 +36,42 @@ const SidebarContent = ({ children, searchProps = {}, style }) => { return ( - {isSearch && ( - - - - - )} + + {isSearch && ( + + + + + )} + {isFile && ( + + + + )} + {children} ); diff --git a/packages/ui-elements/src/components/StaticSelect/StaticSelect.js b/packages/ui-elements/src/components/StaticSelect/StaticSelect.js index d3123dfbac..b64e40b0f2 100644 --- a/packages/ui-elements/src/components/StaticSelect/StaticSelect.js +++ b/packages/ui-elements/src/components/StaticSelect/StaticSelect.js @@ -12,6 +12,7 @@ const StaticSelect = ({ style = {}, options = [], placeholder = '', + isFile, value, onSelect, disabled = false, @@ -22,9 +23,18 @@ const StaticSelect = ({ const styles = getStaticSelectStyles(theme); const [isOpen, setIsOpen] = useState(false); - const [internalValue, setInternalValue] = useState(''); + const [internalValue, setInternalValue] = useState(value || ''); + const [selectedOption, setSelectedOption] = useState(null); const staticSelectRef = useRef(null); + useEffect(() => { + setInternalValue(value || ''); + const option = options.find((opt) => opt.value === value); + if (option) { + setSelectedOption(option); + } + }, [value, options]); + const toggleDropdown = () => { if (!disabled) { setIsOpen(!isOpen); @@ -32,17 +42,15 @@ const StaticSelect = ({ }; const handleSelect = (optionValue) => { + const selectedOpt = options.find((opt) => opt.value === optionValue); setInternalValue(optionValue); + setSelectedOption(selectedOpt); setIsOpen(false); if (onSelect) { onSelect(optionValue); } }; - useEffect(() => { - setInternalValue(value || ''); - }, [value]); - useEffect(() => { const handleClickOutside = (event) => { if ( @@ -61,6 +69,8 @@ const StaticSelect = ({ }; }, [isOpen]); + const displayValue = selectedOption?.label || placeholder; + return ( - {!isOpen && internalValue - ? options.find((option) => option.value === internalValue)?.label - : placeholder} + {displayValue} - {isOpen && ( + {isOpen && !isFile && ( )} + {isOpen && isFile && ( + + + + )} ); }; diff --git a/packages/ui-elements/src/components/StaticSelect/StaticSelect.styles.js b/packages/ui-elements/src/components/StaticSelect/StaticSelect.styles.js index 3374417f64..e42215564b 100644 --- a/packages/ui-elements/src/components/StaticSelect/StaticSelect.styles.js +++ b/packages/ui-elements/src/components/StaticSelect/StaticSelect.styles.js @@ -38,6 +38,15 @@ const getStaticSelectStyles = (theme) => { cursor: not-allowed !important; color: ${theme.colors.mutedForeground}; `, + + fileTypeSelect: css` + position: absolute; + z-index: 10; + top: 100%; + left: 0; + width: 100%; + background-color: white; + `, }; return styles; diff --git a/packages/ui-elements/src/components/ToastBar/ToastBar.js b/packages/ui-elements/src/components/ToastBar/ToastBar.js index 71ea53a9d8..dcec7d6f5f 100644 --- a/packages/ui-elements/src/components/ToastBar/ToastBar.js +++ b/packages/ui-elements/src/components/ToastBar/ToastBar.js @@ -11,6 +11,7 @@ import useTheme from '../../hooks/useTheme'; const ToastBar = ({ toast, onClose }) => { const { type, message, time = 2000 } = toast; const toastRef = useRef(); + const latestOnClose = useRef(onClose); const { theme } = useTheme(); const { classNames, styleOverrides } = useComponentOverrides('ToastBar'); @@ -42,8 +43,15 @@ const ToastBar = ({ toast, onClose }) => { }, [theme.colors, type]); useEffect(() => { - setTimeout(onClose, time); - }, [onClose, time]); + latestOnClose.current = onClose; + }, [onClose]); + + useEffect(() => { + const timer = setTimeout(() => { + latestOnClose.current?.(); + }, time); + return () => clearTimeout(timer); + }, [time]); return ( { position: absolute; z-index: ${theme.zIndex?.toastbar || 1600}; border-radius: ${theme.radius}; - animation: ${animation} ${2000}ms ease-in-out forwards; + display: flex; + flex-direction: column; + gap: 0.75rem; `, }; return styles; diff --git a/packages/ui-elements/src/components/ToastBar/ToastBarProvider.js b/packages/ui-elements/src/components/ToastBar/ToastBarProvider.js index c3507ad61a..1455351ee9 100644 --- a/packages/ui-elements/src/components/ToastBar/ToastBarProvider.js +++ b/packages/ui-elements/src/components/ToastBar/ToastBarProvider.js @@ -6,7 +6,11 @@ const ToastBarProvider = ({ position = 'bottom right', children }) => { const [toasts, setToasts] = useState([]); const dispatchToast = useCallback( (toast) => { - setToasts((prevToasts) => [toast, ...prevToasts]); + const withId = { + id: toast.id || `${Date.now()}-${Math.random().toString(36).slice(2)}`, + ...toast, + }; + setToasts((prevToasts) => [withId, ...prevToasts]); }, [setToasts] ); diff --git a/packages/ui-elements/src/components/ToastBar/ToastContainer.js b/packages/ui-elements/src/components/ToastBar/ToastContainer.js index d417b6d67f..a382444a39 100644 --- a/packages/ui-elements/src/components/ToastBar/ToastContainer.js +++ b/packages/ui-elements/src/components/ToastBar/ToastContainer.js @@ -9,6 +9,7 @@ const ToastContainer = () => { const { theme } = useTheme(); const styles = getToastBarContainerStyles(theme); const { position, toasts, setToasts } = useContext(ToastContext); + const positionStyle = useMemo(() => { const positions = position.split(/\s+/); const styleAnchor = {}; @@ -17,21 +18,29 @@ const ToastContainer = () => { }); return styleAnchor; }, [position]); - const currentToast = useMemo(() => { - const toast = toasts[toasts.length - 1]; - return toast; - }, [toasts]); - const onClose = useCallback(() => { - setToasts(toasts.slice(0, toasts.length - 1)); - }, [setToasts, toasts]); - if (!currentToast) { + const stackedToasts = useMemo(() => [...toasts].reverse(), [toasts]); + + const handleClose = useCallback( + (id) => { + setToasts((prevItems) => prevItems.filter((toast) => toast.id !== id)); + }, + [setToasts] + ); + + if (!stackedToasts.length) { return null; } return ( - + {stackedToasts.map((toast) => ( + handleClose(toast.id)} + /> + ))} ); }; diff --git a/packages/ui-elements/src/components/Tooltip/Tooltip.js b/packages/ui-elements/src/components/Tooltip/Tooltip.js index b4f51bd1b5..cc3eab6801 100644 --- a/packages/ui-elements/src/components/Tooltip/Tooltip.js +++ b/packages/ui-elements/src/components/Tooltip/Tooltip.js @@ -32,6 +32,7 @@ const Tooltip = ({ children, text, position }) => { return ( { > {children} {isTooltipVisible && ( - + {text.charAt(0).toUpperCase() + text.slice(1)} - + )} diff --git a/packages/ui-elements/tools/icons-generator.js b/packages/ui-elements/tools/icons-generator.js index 7dc17fc93b..d12396c2b1 100644 --- a/packages/ui-elements/tools/icons-generator.js +++ b/packages/ui-elements/tools/icons-generator.js @@ -8,9 +8,12 @@ const iconsList = [ 'star', 'reply-directly', 'hash', + 'hash_lock', + 'lock', 'computer', 'cross', 'mic', + 'team', 'circle-cross', 'circle-check', 'send', @@ -64,7 +67,7 @@ const camelCase = (name) => const codeModifier = (code) => { let newCode = code.replace(/class=/g, 'className='); const openingTag = newCode.match(//g)[0]; - const newOpeningTag = openingTag.replace('>', ' {...props}>'); + const newOpeningTag = openingTag.replace(/>/g, ' {...props}>'); newCode = newCode.replace(openingTag, newOpeningTag); return newCode; }; diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index b64de2286f..cb9f8df9e4 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -55,8 +55,8 @@ "lint-staged": "^12.4.2", "npm-run-all": "^4.1.5", "prettier": "^2.8.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "react": "^19.0.0", + "react-dom": "^19.0.0", "rimraf": "^5.0.1", "rollup": "^2.70.1", "rollup-plugin-analyzer": "^4.0.0", @@ -69,8 +69,8 @@ "typescript": "^5.5.3" }, "peerDependencies": { - "react": ">=17.0.2 <19.0.0", - "react-dom": ">=17.0.2 <19.0.0" + "react": ">=19.0.0 <20.0.0", + "react-dom": ">=19.0.0 <20.0.0" }, "dependencies": { "@embeddedchat/markups": "workspace:^", diff --git a/scripts/node-check.js b/scripts/node-check.js index 4e6e0d4b32..e3926519e9 100644 --- a/scripts/node-check.js +++ b/scripts/node-check.js @@ -1,10 +1,12 @@ const fs = require('fs'); const path = require('path'); +const semver = require('semver'); const nvmrcPath = path.join(__dirname, '../.nvmrc'); const expectedVersion = fs.readFileSync(nvmrcPath).toString().trim(); +const expectedMajor = semver.major(expectedVersion); -if (process.version !== expectedVersion) { - console.error(`Error: Required Node.js version is ${expectedVersion}, but found ${process.version}. You can use nvm to manage multiple node versions on a system.`); +if (!semver.satisfies(process.version, `^${expectedMajor}`)) { + console.error(`Error: Required Node.js major version is ${expectedMajor}, but found ${process.version}. You can use nvm to manage multiple node versions on a system.`); process.exit(1); } diff --git a/yarn.lock b/yarn.lock index 37796a83ad..283b25610e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,6 +24,13 @@ __metadata: languageName: node linkType: hard +"@adobe/css-tools@npm:^4.4.0": + version: 4.4.4 + resolution: "@adobe/css-tools@npm:4.4.4" + checksum: 452b82cd9f42aacc57eeaf0b11e36c6864eb482e8a347054cb986503d221d1f7c1418710d2007858d8919afdbd31357149c2c16bd080ded15506f13608d16cf2 + languageName: node + linkType: hard + "@ampproject/remapping@npm:^2.2.0": version: 2.2.1 resolution: "@ampproject/remapping@npm:2.2.1" @@ -47,17 +54,6 @@ __metadata: languageName: node linkType: hard -"@aw-web-design/x-default-browser@npm:1.4.126": - version: 1.4.126 - resolution: "@aw-web-design/x-default-browser@npm:1.4.126" - dependencies: - default-browser-id: 3.0.0 - bin: - x-default-browser: bin/x-default-browser.js - checksum: f63b68a0ff41c8fe478b1b4822e169cac0d26c61b123c0400d5e16a8a5987732b85795aff16d6b21936f9c955f0d32bffbfc166890d3446f74a72a7a2c9633ea - languageName: node - linkType: hard - "@babel/code-frame@npm:7.10.4, @babel/code-frame@npm:~7.10.4": version: 7.10.4 resolution: "@babel/code-frame@npm:7.10.4" @@ -97,6 +93,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" + dependencies: + "@babel/helper-validator-identifier": ^7.28.5 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 39f5b303757e4d63bbff8133e251094cd4f952b46e3fa9febc7368d907583911d6a1eded6090876dc1feeff5cf6e134fb19b706f8d58d26c5402cd50e5e1aeb2 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3": version: 7.23.3 resolution: "@babel/compat-data@npm:7.23.3" @@ -111,7 +118,14 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.17.7, @babel/core@npm:^7.19.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.20.12, @babel/core@npm:^7.22.0, @babel/core@npm:^7.22.9, @babel/core@npm:^7.7.2, @babel/core@npm:^7.7.5, @babel/core@npm:^7.8.0": +"@babel/compat-data@npm:^7.28.6": + version: 7.29.3 + resolution: "@babel/compat-data@npm:7.29.3" + checksum: 977192bab334f66bc8150026340a33ed318c1a7ce18a9323f4c1b86f8ed1d8645bfe5600242bf682717c05c46a4ff06225242207c1d599f4296914b9b4e3efb5 + languageName: node + linkType: hard + +"@babel/core@npm:^7.1.0, @babel/core@npm:^7.11.1, @babel/core@npm:^7.12.10, @babel/core@npm:^7.12.3, @babel/core@npm:^7.13.16, @babel/core@npm:^7.17.7, @babel/core@npm:^7.19.3, @babel/core@npm:^7.20.0, @babel/core@npm:^7.20.12, @babel/core@npm:^7.7.2, @babel/core@npm:^7.8.0": version: 7.23.3 resolution: "@babel/core@npm:7.23.3" dependencies: @@ -134,6 +148,29 @@ __metadata: languageName: node linkType: hard +"@babel/core@npm:^7.18.9, @babel/core@npm:^7.26.0": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-compilation-targets": ^7.28.6 + "@babel/helper-module-transforms": ^7.28.6 + "@babel/helpers": ^7.28.6 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/traverse": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/remapping": ^2.3.5 + convert-source-map: ^2.0.0 + debug: ^4.1.0 + gensync: ^1.0.0-beta.2 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 85e1df6e213382c46dee27bcd07ed9202fa108a85bb74eb37be656308fd949349171ad2aa17cc84cf0720c908dc9ea6309d25e64d2a7fcdaa63721ce0c67c10b + languageName: node + linkType: hard + "@babel/core@npm:^7.23.5": version: 7.23.9 resolution: "@babel/core@npm:7.23.9" @@ -171,7 +208,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.12.11, @babel/generator@npm:^7.20.0, @babel/generator@npm:^7.22.9, @babel/generator@npm:^7.23.3, @babel/generator@npm:^7.23.4, @babel/generator@npm:^7.7.2": +"@babel/generator@npm:^7.20.0, @babel/generator@npm:^7.23.3, @babel/generator@npm:^7.23.4, @babel/generator@npm:^7.7.2": version: 7.23.4 resolution: "@babel/generator@npm:7.23.4" dependencies: @@ -195,6 +232,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" + dependencies: + "@babel/parser": ^7.29.0 + "@babel/types": ^7.29.0 + "@jridgewell/gen-mapping": ^0.3.12 + "@jridgewell/trace-mapping": ^0.3.28 + jsesc: ^3.0.2 + checksum: d8e6863b2d04f684e65ad72731049ac7d754d3a3d1a67cdfc20807b109ba3180ed90d7ccef58ce5d38ded2eaeb71983a76c711eecb9b6266118262378f6c7226 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6, @babel/helper-annotate-as-pure@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" @@ -239,6 +289,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" + dependencies: + "@babel/compat-data": ^7.28.6 + "@babel/helper-validator-option": ^7.27.1 + browserslist: ^4.24.0 + lru-cache: ^5.1.1 + semver: ^6.3.1 + checksum: 8151e36b74eb1c5e414fe945c189436421f7bfa011884de5be3dd7fd77f12f1f733ff7c982581dfa0a49d8af724450243c2409427114b4a6cfeb8333259d001c + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.18.6, @babel/helper-create-class-features-plugin@npm:^7.21.0, @babel/helper-create-class-features-plugin@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" @@ -321,6 +384,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: d8d7b91c12dad1ee747968af0cb73baf91053b2bcf78634da2c2c4991fb45ede9bd0c8f9b5f3254881242bc0921218fcb7c28ae885477c25177147e978ce4397 + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-hoist-variables@npm:7.22.5" @@ -348,6 +418,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" + dependencies: + "@babel/traverse": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 437513aa029898b588a38f7991d7656c539b22f595207d85d0c407240c9e3f2aff8b9d0d7115fdedc91e7fdce4465100549a052024e2fba6a810bcbb7584296b + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.23.3": version: 7.23.3 resolution: "@babel/helper-module-transforms@npm:7.23.3" @@ -363,6 +443,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" + dependencies: + "@babel/helper-module-imports": ^7.28.6 + "@babel/helper-validator-identifier": ^7.28.5 + "@babel/traverse": ^7.28.6 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 522f7d1d08b5e2ccd4ec912aca879bd1506af78d1fb30f46e3e6b4bb69c6ae6ab4e379a879723844230d27dc6d04a55b03f5215cd3141b7a2b40bb4a02f71a9f + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.22.5": version: 7.22.5 resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" @@ -439,6 +532,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 0a8464adc4b39b138aedcb443b09f4005d86207d7126e5e079177e05c3116107d856ec08282b365e9a79a9872f40f4092a6127f8d74c8a01c1ef789dacfc25d6 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-validator-identifier@npm:7.22.20" @@ -453,6 +553,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 5a251a6848e9712aea0338f659a1a3bd334d26219d5511164544ca8ec20774f098c3a6661e9da65a0d085c745c00bb62c8fada38a62f08fa1f8053bc0aeb57e4 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.22.15": version: 7.22.15 resolution: "@babel/helper-validator-option@npm:7.22.15" @@ -467,6 +574,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.22.20": version: 7.22.20 resolution: "@babel/helper-wrap-function@npm:7.22.20" @@ -500,6 +614,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.28.6": + version: 7.29.2 + resolution: "@babel/helpers@npm:7.29.2" + dependencies: + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + checksum: 2c8ce711a639ef334539d3bd48977f57493f71af99e13d3f685fe47b3bc32aa83dbc1380688e19d5df924d958f8f29072f3dcff8110257ba6399524907287189 + languageName: node + linkType: hard + "@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.23.4": version: 7.23.4 resolution: "@babel/highlight@npm:7.23.4" @@ -523,7 +647,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.22.7, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.4": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.13.16, @babel/parser@npm:^7.14.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.3, @babel/parser@npm:^7.23.4": version: 7.23.4 resolution: "@babel/parser@npm:7.23.4" bin: @@ -541,6 +665,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.3 + resolution: "@babel/parser@npm:7.29.3" + dependencies: + "@babel/types": ^7.29.0 + bin: + parser: ./bin/babel-parser.js + checksum: 046f46996bf4053b6e29f8a7f420f9e0a2878593c1c9a9914a36faca23fc544a307c78a0101ba3ae98936ade68bdde686a83e1ab2b74c2ebb80dc4a9df48476d + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.23.3": version: 7.23.3 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.23.3" @@ -1698,7 +1833,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:^7.16.11, @babel/preset-env@npm:^7.20.0, @babel/preset-env@npm:^7.22.9, @babel/preset-env@npm:^7.9.0": +"@babel/preset-env@npm:^7.11.0, @babel/preset-env@npm:^7.12.11, @babel/preset-env@npm:^7.16.11, @babel/preset-env@npm:^7.20.0, @babel/preset-env@npm:^7.9.0": version: 7.23.3 resolution: "@babel/preset-env@npm:7.23.3" dependencies: @@ -1788,7 +1923,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-flow@npm:^7.13.13, @babel/preset-flow@npm:^7.22.5": +"@babel/preset-flow@npm:^7.13.13": version: 7.23.3 resolution: "@babel/preset-flow@npm:7.23.3" dependencies: @@ -1814,7 +1949,7 @@ __metadata: languageName: node linkType: hard -"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:^7.16.7, @babel/preset-react@npm:^7.22.5": +"@babel/preset-react@npm:^7.12.10, @babel/preset-react@npm:^7.16.7": version: 7.23.3 resolution: "@babel/preset-react@npm:7.23.3" dependencies: @@ -1867,7 +2002,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.1, @babel/runtime@npm:^7.21.0, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.4": version: 7.23.4 resolution: "@babel/runtime@npm:7.23.4" dependencies: @@ -1885,7 +2020,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.0.0, @babel/template@npm:^7.20.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": +"@babel/template@npm:^7.0.0, @babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": version: 7.22.15 resolution: "@babel/template@npm:7.22.15" dependencies: @@ -1907,7 +2042,18 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.22.8, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.4, @babel/traverse@npm:^7.7.2": +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" + dependencies: + "@babel/code-frame": ^7.28.6 + "@babel/parser": ^7.28.6 + "@babel/types": ^7.28.6 + checksum: 8ab6383053e226025d9491a6e795293f2140482d14f60c1244bece6bf53610ed1e251d5e164de66adab765629881c7d9416e1e540c716541d2fd0f8f36a013d7 + languageName: node + linkType: hard + +"@babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.20.0, @babel/traverse@npm:^7.23.3, @babel/traverse@npm:^7.23.4, @babel/traverse@npm:^7.7.2": version: 7.23.4 resolution: "@babel/traverse@npm:7.23.4" dependencies: @@ -1925,6 +2071,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.18.9, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" + dependencies: + "@babel/code-frame": ^7.29.0 + "@babel/generator": ^7.29.0 + "@babel/helper-globals": ^7.28.0 + "@babel/parser": ^7.29.0 + "@babel/template": ^7.28.6 + "@babel/types": ^7.29.0 + debug: ^4.3.1 + checksum: fbb5085aa525b5d4ecd9fe2f5885d88413fff6ad9c0fac244c37f96069b6d3af9ce825750cd16af1d97d26fa3d354b38dbbdb5f31430e0d99ed89660ab65430e + languageName: node + linkType: hard + "@babel/traverse@npm:^7.23.9": version: 7.23.9 resolution: "@babel/traverse@npm:7.23.9" @@ -1943,7 +2104,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.5, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3, @babel/types@npm:^7.23.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.3, @babel/types@npm:^7.23.4, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.23.4 resolution: "@babel/types@npm:7.23.4" dependencies: @@ -1954,6 +2115,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.18.9, @babel/types@npm:^7.28.2, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" + dependencies: + "@babel/helper-string-parser": ^7.27.1 + "@babel/helper-validator-identifier": ^7.28.5 + checksum: 83f190438e94c22b2574aaeef7501830311ef266eaabfb06523409f64e2fe855e522951607085d71cad286719adef14e1ba37b671f334a7cd25b0f8506a01e0b + languageName: node + linkType: hard + "@babel/types@npm:^7.23.6, @babel/types@npm:^7.23.9": version: 7.23.9 resolution: "@babel/types@npm:7.23.9" @@ -1965,13 +2136,6 @@ __metadata: languageName: node linkType: hard -"@base2/pretty-print-object@npm:1.0.1": - version: 1.0.1 - resolution: "@base2/pretty-print-object@npm:1.0.1" - checksum: 1e8a5af578037a9d47d72f815983f9e4efb038e5f03e7635fc893194c5daa723215d71af33267893a9b618656c8eaea7be931b1c063c9b066a40994be0d23545 - languageName: node - linkType: hard - "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -2215,20 +2379,6 @@ __metadata: languageName: node linkType: hard -"@colors/colors@npm:1.5.0": - version: 1.5.0 - resolution: "@colors/colors@npm:1.5.0" - checksum: d64d5260bed1d5012ae3fc617d38d1afc0329fec05342f4e6b838f46998855ba56e0a73833f4a80fa8378c84810da254f76a8a19c39d038260dc06dc4e007425 - languageName: node - linkType: hard - -"@discoveryjs/json-ext@npm:^0.5.3": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 - languageName: node - linkType: hard - "@dnd-kit/accessibility@npm:^3.1.0": version: 3.1.0 resolution: "@dnd-kit/accessibility@npm:3.1.0" @@ -2292,7 +2442,8 @@ __metadata: resolution: "@embeddedchat/api@workspace:packages/api" dependencies: "@embeddedchat/auth": "workspace:^" - "@rocket.chat/sdk": ^1.0.0-alpha.42 + "@rocket.chat/ddp-client": 1.0.9-rc.2 + "@rocket.chat/emitter": ^0.31.25 parcel: ^2.10.3 rollup: ^3.23.0 rollup-plugin-dts: ^6.0.1 @@ -2319,8 +2470,8 @@ __metadata: "@embeddedchat/react": "workspace:^" "@vitejs/plugin-react": ^3.1.0 live-server: ^1.2.2 - react: ^18.2.0 - react-dom: ^18.2.0 + react: ^19.0.0 + react-dom: ^19.0.0 vite: ^4.2.0 vite-plugin-css-injected-by-js: ^3.1.0 languageName: unknown @@ -2364,8 +2515,9 @@ __metadata: npm-run-all: ^4.1.5 prettier: ^2.8.1 prop-types: ^15.8.1 - react: ^17.0.2 - react-dom: ^17.0.2 + react: ^19.0.0 + react-dom: ^19.0.0 + react-syntax-highlighter: ^15.6.1 rimraf: ^5.0.1 rollup: ^2.70.1 rollup-plugin-analyzer: ^4.0.0 @@ -2377,8 +2529,8 @@ __metadata: schedule: ^0.4.0 typescript: ^5.5.3 peerDependencies: - react: ">=17.0.2 <19.0.0" - react-dom: ">=17.0.2 <19.0.0" + react: ">=19.0.0 <20.0.0" + react-dom: ">=19.0.0 <20.0.0" languageName: unknown linkType: soft @@ -2464,14 +2616,14 @@ __metadata: "@rollup/plugin-json": ^6.0.0 "@rollup/plugin-node-resolve": ^13.1.3 "@rollup/plugin-replace": ^5.0.2 - "@storybook/addon-essentials": ^7.0.26 - "@storybook/addon-interactions": ^7.0.26 - "@storybook/addon-links": ^7.0.26 - "@storybook/addon-styling": ^1.3.6 - "@storybook/blocks": ^7.0.26 - "@storybook/react": ^7.0.26 - "@storybook/react-webpack5": ^7.0.26 - "@storybook/testing-library": ^0.2.0 + "@storybook/addon-essentials": ^8.6.18 + "@storybook/addon-interactions": ^8.6.18 + "@storybook/addon-links": ^8.6.18 + "@storybook/addon-webpack5-compiler-babel": ~3.0.0 + "@storybook/blocks": ^8.6.18 + "@storybook/react": ^8.6.18 + "@storybook/react-webpack5": ^8.6.18 + "@storybook/test": ^8.6.18 "@testing-library/react": ^12.1.4 babel-jest: ^27.5.1 concurrently: ^7.2.0 @@ -2498,8 +2650,8 @@ __metadata: npm-run-all: ^4.1.5 prettier: ^2.8.1 prop-types: ^15.8.1 - react: ^17.0.2 - react-dom: ^17.0.2 + react: ^19.0.0 + react-dom: ^19.0.0 rimraf: ^5.0.1 rollup: ^2.70.1 rollup-plugin-analyzer: ^4.0.0 @@ -2508,13 +2660,12 @@ __metadata: rollup-plugin-postcss: ^4.0.2 rollup-plugin-terser: ^7.0.2 sass: ^1.66.1 - schedule: ^0.4.0 - storybook: ^7.0.26 + storybook: ^8.6.18 swiper: ^11.1.0 zustand: ^4.3.8 peerDependencies: - react: ">=17.0.2 <19.0.0" - react-dom: ">=17.0.2 <19.0.0" + react: ">=19.0.0 <20.0.0" + react-dom: ">=19.0.0 <20.0.0" languageName: unknown linkType: soft @@ -2536,14 +2687,14 @@ __metadata: "@rollup/plugin-json": ^6.0.0 "@rollup/plugin-node-resolve": ^13.1.3 "@rollup/plugin-replace": ^5.0.2 - "@storybook/addon-essentials": ^7.0.26 - "@storybook/addon-interactions": ^7.0.26 - "@storybook/addon-links": ^7.0.26 - "@storybook/addon-styling": ^1.3.6 - "@storybook/blocks": ^7.0.26 - "@storybook/react": ^7.0.26 - "@storybook/react-webpack5": ^7.0.26 - "@storybook/testing-library": ^0.2.0 + "@storybook/addon-essentials": ^8.6.18 + "@storybook/addon-interactions": ^8.6.18 + "@storybook/addon-links": ^8.6.18 + "@storybook/addon-webpack5-compiler-babel": ~3.0.0 + "@storybook/blocks": ^8.6.18 + "@storybook/react": ^8.6.18 + "@storybook/react-webpack5": ^8.6.18 + "@storybook/test": ^8.6.18 "@testing-library/react": ^12.1.4 babel-jest: ^27.5.1 color: ^4.2.3 @@ -2567,8 +2718,8 @@ __metadata: npm-run-all: ^4.1.5 prettier: ^2.8.1 prop-types: ^15.8.1 - react: ^17.0.2 - react-dom: ^17.0.2 + react: ^19.0.0 + react-dom: ^19.0.0 rimraf: ^5.0.1 rollup: ^2.70.1 rollup-plugin-analyzer: ^4.0.0 @@ -2578,11 +2729,11 @@ __metadata: rollup-plugin-terser: ^7.0.2 sass: ^1.66.1 schedule: ^0.4.0 - storybook: ^7.0.26 + storybook: ^8.6.18 typescript: ^5.5.3 peerDependencies: - react: ">=17.0.2 <19.0.0" - react-dom: ">=17.0.2 <19.0.0" + react: ">=19.0.0 <20.0.0" + react-dom: ">=19.0.0 <20.0.0" languageName: unknown linkType: soft @@ -2628,8 +2779,8 @@ __metadata: npm-run-all: ^4.1.5 prettier: ^2.8.1 prop-types: ^15.8.1 - react: ^17.0.2 - react-dom: ^17.0.2 + react: ^19.0.0 + react-dom: ^19.0.0 rimraf: ^5.0.1 rollup: ^2.70.1 rollup-plugin-analyzer: ^4.0.0 @@ -2641,8 +2792,8 @@ __metadata: schedule: ^0.4.0 typescript: ^5.5.3 peerDependencies: - react: ">=17.0.2 <19.0.0" - react-dom: ">=17.0.2 <19.0.0" + react: ">=19.0.0 <20.0.0" + react-dom: ">=19.0.0 <20.0.0" languageName: unknown linkType: soft @@ -2790,15 +2941,6 @@ __metadata: languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.0": - version: 1.0.1 - resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" - peerDependencies: - react: ">=16.8.0" - checksum: 700b6e5bbb37a9231f203bb3af11295eed01d73b2293abece0bc2a2237015e944d7b5114d4887ad9a79776504aa51ed2a8b0ddbc117c54495dd01a6b22f93786 - languageName: node - linkType: hard - "@emotion/utils@npm:^1.0.0, @emotion/utils@npm:^1.2.1": version: 1.2.1 resolution: "@emotion/utils@npm:1.2.1" @@ -2827,6 +2969,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/aix-ppc64@npm:0.25.12" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm64@npm:0.17.19" @@ -2855,6 +3004,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm64@npm:0.25.12" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-arm@npm:0.17.19" @@ -2883,6 +3039,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-arm@npm:0.25.12" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/android-x64@npm:0.17.19" @@ -2911,6 +3074,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/android-x64@npm:0.25.12" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/darwin-arm64@npm:0.17.19" @@ -2939,6 +3109,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-arm64@npm:0.25.12" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/darwin-x64@npm:0.17.19" @@ -2967,6 +3144,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/darwin-x64@npm:0.25.12" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-arm64@npm:0.17.19" @@ -2995,6 +3179,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-arm64@npm:0.25.12" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/freebsd-x64@npm:0.17.19" @@ -3023,6 +3214,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/freebsd-x64@npm:0.25.12" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm64@npm:0.17.19" @@ -3051,6 +3249,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm64@npm:0.25.12" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-arm@npm:0.17.19" @@ -3079,6 +3284,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-arm@npm:0.25.12" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ia32@npm:0.17.19" @@ -3107,6 +3319,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ia32@npm:0.25.12" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-loong64@npm:0.17.19" @@ -3135,6 +3354,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-loong64@npm:0.25.12" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-mips64el@npm:0.17.19" @@ -3163,6 +3389,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-mips64el@npm:0.25.12" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-ppc64@npm:0.17.19" @@ -3191,6 +3424,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-ppc64@npm:0.25.12" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-riscv64@npm:0.17.19" @@ -3219,6 +3459,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-riscv64@npm:0.25.12" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-s390x@npm:0.17.19" @@ -3247,6 +3494,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-s390x@npm:0.25.12" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/linux-x64@npm:0.17.19" @@ -3275,6 +3529,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/linux-x64@npm:0.25.12" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-arm64@npm:0.25.12" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/netbsd-x64@npm:0.17.19" @@ -3303,6 +3571,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/netbsd-x64@npm:0.25.12" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-arm64@npm:0.25.12" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/openbsd-x64@npm:0.17.19" @@ -3331,6 +3613,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openbsd-x64@npm:0.25.12" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/openharmony-arm64@npm:0.25.12" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/sunos-x64@npm:0.17.19" @@ -3359,6 +3655,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/sunos-x64@npm:0.25.12" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-arm64@npm:0.17.19" @@ -3387,6 +3690,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-arm64@npm:0.25.12" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-ia32@npm:0.17.19" @@ -3415,6 +3725,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-ia32@npm:0.25.12" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.17.19": version: 0.17.19 resolution: "@esbuild/win32-x64@npm:0.17.19" @@ -3443,6 +3760,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.25.12": + version: 0.25.12 + resolution: "@esbuild/win32-x64@npm:0.25.12" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3866,51 +4190,6 @@ __metadata: languageName: node linkType: hard -"@fal-works/esbuild-plugin-global-externals@npm:^2.1.2": - version: 2.1.2 - resolution: "@fal-works/esbuild-plugin-global-externals@npm:2.1.2" - checksum: c59715902b9062aa7ff38973f298b509499fd146dbf564dc338b3f9e896da5bffb4ca676c27587fde79b3586003e24d65960acb62f009bca43dca34c76f8cbf7 - languageName: node - linkType: hard - -"@floating-ui/core@npm:^1.4.2": - version: 1.5.0 - resolution: "@floating-ui/core@npm:1.5.0" - dependencies: - "@floating-ui/utils": ^0.1.3 - checksum: 54b4fe26b3c228746ac5589f97303abf158b80aa5f8b99027259decd68d1c2030c4c637648ebd33dfe78a4212699453bc2bd7537fd5a594d3bd3e63d362f666f - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.5.1": - version: 1.5.3 - resolution: "@floating-ui/dom@npm:1.5.3" - dependencies: - "@floating-ui/core": ^1.4.2 - "@floating-ui/utils": ^0.1.3 - checksum: 00053742064aac70957f0bd5c1542caafb3bfe9716588bfe1d409fef72a67ed5e60450d08eb492a77f78c22ed1ce4f7955873cc72bf9f9caf2b0f43ae3561c21 - languageName: node - linkType: hard - -"@floating-ui/react-dom@npm:^2.0.0": - version: 2.0.4 - resolution: "@floating-ui/react-dom@npm:2.0.4" - dependencies: - "@floating-ui/dom": ^1.5.1 - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 91b2369e25f84888486e48c1656117468248906034ed482d411bb9ed1061b908dd32435b4ca3d0cd0ca6083291510a98ce74d76c671d5cc25b0c41e5fa824bae - languageName: node - linkType: hard - -"@floating-ui/utils@npm:^0.1.3": - version: 0.1.6 - resolution: "@floating-ui/utils@npm:0.1.6" - checksum: b34d4b5470869727f52e312e08272edef985ba5a450a76de0917ba0a9c6f5df2bdbeb99448e2c60f39b177fb8981c772ff1831424e75123471a27ebd5b52c1eb - languageName: node - linkType: hard - "@gar/promisify@npm:^1.0.1, @gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -4018,6 +4297,21 @@ __metadata: languageName: node linkType: hard +"@inquirer/external-editor@npm:^1.0.0": + version: 1.0.3 + resolution: "@inquirer/external-editor@npm:1.0.3" + dependencies: + chardet: ^2.1.1 + iconv-lite: ^0.7.0 + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: 9bd7a05247a00408c194648c74046d8a212df1e6b9fe0879b945ebfc35c2524e995e43f7ecd83f14d0bd4e31f985d18819efc31c27810e2c2b838ded7261431f + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -4052,7 +4346,7 @@ __metadata: languageName: node linkType: hard -"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": +"@istanbuljs/schema@npm:^0.1.2": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 @@ -4291,29 +4585,6 @@ __metadata: languageName: node linkType: hard -"@jest/transform@npm:^29.3.1": - version: 29.7.0 - resolution: "@jest/transform@npm:29.7.0" - dependencies: - "@babel/core": ^7.11.6 - "@jest/types": ^29.6.3 - "@jridgewell/trace-mapping": ^0.3.18 - babel-plugin-istanbul: ^6.1.1 - chalk: ^4.0.0 - convert-source-map: ^2.0.0 - fast-json-stable-stringify: ^2.1.0 - graceful-fs: ^4.2.9 - jest-haste-map: ^29.7.0 - jest-regex-util: ^29.6.3 - jest-util: ^29.7.0 - micromatch: ^4.0.4 - pirates: ^4.0.4 - slash: ^3.0.0 - write-file-atomic: ^4.0.2 - checksum: 0f8ac9f413903b3cb6d240102db848f2a354f63971ab885833799a9964999dd51c388162106a807f810071f864302cdd8e3f0c241c29ce02d85a36f18f3f40ab - languageName: node - linkType: hard - "@jest/types@npm:^26.6.2": version: 26.6.2 resolution: "@jest/types@npm:26.6.2" @@ -4365,9 +4636,29 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.0 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: f2105acefc433337145caa3c84bba286de954f61c0bc46279bbd85a9e6a02871089717fa060413cfb6a9d44189fe8313b2d1cabf3a2eb3284d208fd5f75c54ff + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.24 + checksum: 4a66a7397c3dc9c6b5c14a0024b1f98c5e1d90a0dbc1e5955b5038f2db339904df2a0ee8a66559fafb4fc23ff33700a2639fd40bbdd2e9e82b58b3bdf83738e3 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard @@ -4396,7 +4687,14 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/sourcemap-codec@npm:^1.5.0, @jridgewell/sourcemap-codec@npm:^1.5.5": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: c2e36e67971f719a8a3a85ef5a5f580622437cc723c35d03ebd0c9c0b06418700ef006f58af742791f71f6a4fc68fcfaf1f6a74ec2f9a3332860e9373459dae7 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.20 resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: @@ -4406,10 +4704,13 @@ __metadata: languageName: node linkType: hard -"@juggle/resize-observer@npm:^3.3.1": - version: 3.4.0 - resolution: "@juggle/resize-observer@npm:3.4.0" - checksum: 2505028c05cc2e17639fcad06218b1c4b60f932a4ebb4b41ab546ef8c157031ae377e3f560903801f6d01706dbefd4943b6c4704bf19ed86dfa1c62f1473a570 +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: af8fda2431348ad507fbddf8e25f5d08c79ecc94594061ce402cf41bc5aba1a7b3e59bf0fd70a619b35f33983a3f488ceeba8faf56bff784f98bb5394a8b7d47 languageName: node linkType: hard @@ -4599,15 +4900,15 @@ __metadata: languageName: node linkType: hard -"@mdx-js/react@npm:^2.1.5": - version: 2.3.0 - resolution: "@mdx-js/react@npm:2.3.0" +"@mdx-js/react@npm:^3.0.0": + version: 3.1.1 + resolution: "@mdx-js/react@npm:3.1.1" dependencies: "@types/mdx": ^2.0.0 - "@types/react": ">=16" peerDependencies: + "@types/react": ">=16" react: ">=16" - checksum: f45fe779556e6cd9a787f711274480e0638b63c460f192ebdcd77cc07ffa61e23c98cb46dd46e577093e1cb4997a232a848d1fb0ba850ae204422cf603add524 + checksum: 7e1742c530dd4b5b586f9ccbc8451062b9a1b4c3c8dd00537aa910b34c7404e4120d50dbd0a19f1697ae8e600d9e5848e29fad846d2975b7c5c7d8d2bd798c83 languageName: node linkType: hard @@ -4664,17 +4965,6 @@ __metadata: languageName: node linkType: hard -"@ndelangen/get-tarball@npm:^3.0.7": - version: 3.0.9 - resolution: "@ndelangen/get-tarball@npm:3.0.9" - dependencies: - gunzip-maybe: ^1.4.2 - pump: ^3.0.0 - tar-fs: ^2.1.1 - checksum: 7fa8ac40b4e85738a4ee6bf891bc27fce2445b65b4477e0ec86aed0fa62ab18bdf5d193ce04553ad9bfa639e1eef33b8b30da4ef3e7218f12bf95f24c8786e5b - languageName: node - linkType: hard - "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -6150,802 +6440,195 @@ __metadata: languageName: node linkType: hard -"@pmmmwh/react-refresh-webpack-plugin@npm:^0.5.5": - version: 0.5.11 - resolution: "@pmmmwh/react-refresh-webpack-plugin@npm:0.5.11" +"@react-native-async-storage/async-storage@npm:1.17.11": + version: 1.17.11 + resolution: "@react-native-async-storage/async-storage@npm:1.17.11" dependencies: - ansi-html-community: ^0.0.8 - common-path-prefix: ^3.0.0 - core-js-pure: ^3.23.3 - error-stack-parser: ^2.0.6 - find-up: ^5.0.0 - html-entities: ^2.1.0 - loader-utils: ^2.0.4 - schema-utils: ^3.0.0 - source-map: ^0.7.3 + merge-options: ^3.0.4 peerDependencies: - "@types/webpack": 4.x || 5.x - react-refresh: ">=0.10.0 <1.0.0" - sockjs-client: ^1.4.0 - type-fest: ">=0.17.0 <5.0.0" - webpack: ">=4.43.0 <6.0.0" - webpack-dev-server: 3.x || 4.x - webpack-hot-middleware: 2.x - webpack-plugin-serve: 0.x || 1.x - peerDependenciesMeta: - "@types/webpack": - optional: true - sockjs-client: - optional: true - type-fest: - optional: true - webpack-dev-server: - optional: true - webpack-hot-middleware: - optional: true - webpack-plugin-serve: - optional: true - checksum: a82eced9519f4dcac424acae719f819ab4150bfcf2874ac7daaf25a4f1c409e3d8b9d693fea0c686c24d520a5473756df32da90d8b89739670f8f8084c600bb4 + react-native: ^0.0.0-0 || 0.60 - 0.71 || 1000.0.0 + checksum: 691f2b74498160d0b532f673402d8affeecb28b005b1c6d6fa2e7c87f89ab3068177e8e2d2686738306e7592a39c6d7148aa4c426b7e8e149c43a336ad446648 languageName: node linkType: hard -"@radix-ui/number@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/number@npm:1.0.1" +"@react-native-community/cli-clean@npm:^10.1.1": + version: 10.1.1 + resolution: "@react-native-community/cli-clean@npm:10.1.1" dependencies: - "@babel/runtime": ^7.13.10 - checksum: 621ea8b7d4195d1a65a9c0aee918e8335e7f198088eec91577512c89c2ba3a3bab4a767cfb872a2b9c3092a78ff41cad9a924845a939f6bb87fe9356241ea0ea + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + execa: ^1.0.0 + prompts: ^2.4.0 + checksum: 2994aa6f0651390af7195742a87d2a79c7970acc7e51e65908d56b288302c531534171563926b91da852550674829c68476e20fdd03cba06406bb28f22bc400e languageName: node linkType: hard -"@radix-ui/primitive@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/primitive@npm:1.0.1" +"@react-native-community/cli-config@npm:^10.1.1": + version: 10.1.1 + resolution: "@react-native-community/cli-config@npm:10.1.1" dependencies: - "@babel/runtime": ^7.13.10 - checksum: 2b93e161d3fdabe9a64919def7fa3ceaecf2848341e9211520c401181c9eaebb8451c630b066fad2256e5c639c95edc41de0ba59c40eff37e799918d019822d1 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + cosmiconfig: ^5.1.0 + deepmerge: ^3.2.0 + glob: ^7.1.3 + joi: ^17.2.1 + checksum: e665f9181eb402d3a9ab5622d19f0c9985ea029df5451c2ae6a3c48126816632d35d5f4d70a8710648428e097933d182b42fac84bae46b49e8c456019802e44e languageName: node linkType: hard -"@radix-ui/react-arrow@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-arrow@npm:1.0.3" +"@react-native-community/cli-debugger-ui@npm:^10.0.0": + version: 10.0.0 + resolution: "@react-native-community/cli-debugger-ui@npm:10.0.0" dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-primitive": 1.0.3 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 8cca086f0dbb33360e3c0142adf72f99fc96352d7086d6c2356dbb2ea5944cfb720a87d526fc48087741c602cd8162ca02b0af5e6fdf5f56d20fddb44db8b4c3 + serve-static: ^1.13.1 + checksum: 519b395f9d0eabe8c774a6fd776b1e33d75627959768975b14af085a20e3833dc4457e84e7aaf8b48f192b92007055e2017651eb685f625f6d45ed6f6c467641 languageName: node linkType: hard -"@radix-ui/react-collection@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-collection@npm:1.0.3" +"@react-native-community/cli-doctor@npm:^10.2.2": + version: 10.2.5 + resolution: "@react-native-community/cli-doctor@npm:10.2.5" dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-slot": 1.0.2 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: acfbc9b0b2c553d343c22f02c9f098bc5cfa99e6e48df91c0d671855013f8b877ade9c657b7420a7aa523b5aceadea32a60dd72c23b1291f415684fb45d00cff + "@react-native-community/cli-config": ^10.1.1 + "@react-native-community/cli-platform-ios": ^10.2.5 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + command-exists: ^1.2.8 + envinfo: ^7.7.2 + execa: ^1.0.0 + hermes-profile-transformer: ^0.0.6 + ip: ^1.1.5 + node-stream-zip: ^1.9.1 + ora: ^5.4.1 + prompts: ^2.4.0 + semver: ^6.3.0 + strip-ansi: ^5.2.0 + sudo-prompt: ^9.0.0 + wcwidth: ^1.0.1 + checksum: 5189e2031e2f7fe142c90fab97ff7c025da959deae782f12ba0b4f82991d1e076eac32f2713e905c13a7b2400ee3090e2f808b90db1cb60b8845ffbc8eddc6de languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-compose-refs@npm:1.0.1" +"@react-native-community/cli-hermes@npm:^10.2.0": + version: 10.2.0 + resolution: "@react-native-community/cli-hermes@npm:10.2.0" dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 2b9a613b6db5bff8865588b6bf4065f73021b3d16c0a90b2d4c23deceeb63612f1f15de188227ebdc5f88222cab031be617a9dd025874c0487b303be3e5cc2a8 + "@react-native-community/cli-platform-android": ^10.2.0 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + hermes-profile-transformer: ^0.0.6 + ip: ^1.1.5 + checksum: a0dbe70ec4820abd9c4f209e8520473ac8991cfa672127818b3127ebc1daad556f07dc7faf32a293af934e1db96a29a553da81c06758fdc7c66c8ab232b90cea languageName: node linkType: hard -"@radix-ui/react-context@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-context@npm:1.0.1" +"@react-native-community/cli-platform-android@npm:10.2.0, @react-native-community/cli-platform-android@npm:^10.2.0": + version: 10.2.0 + resolution: "@react-native-community/cli-platform-android@npm:10.2.0" dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 60e9b81d364f40c91a6213ec953f7c64fcd9d75721205a494a5815b3e5ae0719193429b62ee6c7002cd6aaf70f8c0e2f08bdbaba9ffcc233044d32b56d2127d1 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + execa: ^1.0.0 + glob: ^7.1.3 + logkitty: ^0.7.1 + checksum: 368b6c016aafce0c969a61e9d9ff84c9ed8ff14c4ef19146dc0e38be1ac0c678af9eb1fa428348ac56c1e3e1eace37aaa1e2a19ee772e636db1122ea9c918e46 languageName: node linkType: hard -"@radix-ui/react-direction@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-direction@npm:1.0.1" +"@react-native-community/cli-platform-ios@npm:10.2.1": + version: 10.2.1 + resolution: "@react-native-community/cli-platform-ios@npm:10.2.1" dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 5336a8b0d4f1cde585d5c2b4448af7b3d948bb63a1aadb37c77771b0e5902dc6266e409cf35fd0edaca7f33e26424be19e64fb8f9d7f7be2d6f1714ea2764210 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + execa: ^1.0.0 + fast-xml-parser: ^4.0.12 + glob: ^7.1.3 + ora: ^5.4.1 + checksum: 17228084eb482dd769eaf872b779be9d901f28645b6888915646a7dd002f9c3317fd92a3b9d3a7744fa8580155aea1b1225a56642e4f31581970ae39a9a12b83 languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-dismissable-layer@npm:1.0.4" +"@react-native-community/cli-platform-ios@npm:^10.2.5": + version: 10.2.5 + resolution: "@react-native-community/cli-platform-ios@npm:10.2.5" dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-use-callback-ref": 1.0.1 - "@radix-ui/react-use-escape-keydown": 1.0.3 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: ea86004ed56a10609dd84eef39dc1e57b400d687a35be41bb4aaa06dc7ad6dbd0a8da281e08c8c077fdbd523122e4d860cb7438a60c664f024f77c8b41299ec6 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + execa: ^1.0.0 + fast-xml-parser: ^4.0.12 + glob: ^7.1.3 + ora: ^5.4.1 + checksum: d689359373bfc96f52e4501da6b62f513efddfd5e09ac679d60531926153318080d0538425d95b3889f6e2f1e33951fd48d8956215aecbf35c3d3cafb6884b69 languageName: node linkType: hard -"@radix-ui/react-focus-guards@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-focus-guards@npm:1.0.1" +"@react-native-community/cli-plugin-metro@npm:^10.2.2": + version: 10.2.3 + resolution: "@react-native-community/cli-plugin-metro@npm:10.2.3" dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 1f8ca8f83b884b3612788d0742f3f054e327856d90a39841a47897dbed95e114ee512362ae314177de226d05310047cabbf66b686ae86ad1b65b6b295be24ef7 + "@react-native-community/cli-server-api": ^10.1.1 + "@react-native-community/cli-tools": ^10.1.1 + chalk: ^4.1.2 + execa: ^1.0.0 + metro: 0.73.10 + metro-config: 0.73.10 + metro-core: 0.73.10 + metro-react-native-babel-transformer: 0.73.10 + metro-resolver: 0.73.10 + metro-runtime: 0.73.10 + readline: ^1.3.0 + checksum: a30e0ef50e36adfb5b86a9cd086543e6d43c25e4c47d66517dfcf7c40a6fc08fc32bee17286efebfc9fd877e9396d76e15f9bd20359d187692f0deb8877b9825 languageName: node linkType: hard -"@radix-ui/react-focus-scope@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-focus-scope@npm:1.0.3" +"@react-native-community/cli-server-api@npm:^10.1.1": + version: 10.1.1 + resolution: "@react-native-community/cli-server-api@npm:10.1.1" dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-use-callback-ref": 1.0.1 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: e5b1a089071fbe77aca11124a4ad9623fc2bcaf4c019759b0cd044bf0878ecc924131ee09c6a22d38a3f094684ef68ed18fa65c8d891918412e0afc685a464e0 + "@react-native-community/cli-debugger-ui": ^10.0.0 + "@react-native-community/cli-tools": ^10.1.1 + compression: ^1.7.1 + connect: ^3.6.5 + errorhandler: ^1.5.0 + nocache: ^3.0.1 + pretty-format: ^26.6.2 + serve-static: ^1.13.1 + ws: ^7.5.1 + checksum: ce1bf6374a45a677942aecffe3d0ea6671f18b2d694eb39e61592dae596ee98ab936f8e61faaf5b032168919959aad63f932001cf3553c04d87ef16333a4c0ec languageName: node linkType: hard -"@radix-ui/react-id@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-id@npm:1.0.1" +"@react-native-community/cli-tools@npm:^10.1.1": + version: 10.1.1 + resolution: "@react-native-community/cli-tools@npm:10.1.1" dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-use-layout-effect": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 446a453d799cc790dd2a1583ff8328da88271bff64530b5a17c102fa7fb35eece3cf8985359d416f65e330cd81aa7b8fe984ea125fc4f4eaf4b3801d698e49fe + appdirsjs: ^1.2.4 + chalk: ^4.1.2 + find-up: ^5.0.0 + mime: ^2.4.1 + node-fetch: ^2.6.0 + open: ^6.2.0 + ora: ^5.4.1 + semver: ^6.3.0 + shell-quote: ^1.7.3 + checksum: a70ac3d9f294066db454482b6cadee3613a06cafaf08cd6e24ea941a6936f919672ccb638b8ab8d3ae3ad29c4e7cec64557afcd09ba4d0587eb50b88bd98567b languageName: node linkType: hard -"@radix-ui/react-popper@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-popper@npm:1.1.2" +"@react-native-community/cli-types@npm:^10.0.0": + version: 10.0.0 + resolution: "@react-native-community/cli-types@npm:10.0.0" dependencies: - "@babel/runtime": ^7.13.10 - "@floating-ui/react-dom": ^2.0.0 - "@radix-ui/react-arrow": 1.0.3 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-use-callback-ref": 1.0.1 - "@radix-ui/react-use-layout-effect": 1.0.1 - "@radix-ui/react-use-rect": 1.0.1 - "@radix-ui/react-use-size": 1.0.1 - "@radix-ui/rect": 1.0.1 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 4929daa0d1cccada3cff50de0e00c0d186ffea97a5f28545c77fa85ff9bc5c105a54dddac400c2e2dcac631f0f7ea88e59f2e5ad0f80bb2cb7b62cc7cd30400f + joi: ^17.2.1 + checksum: 6153088d6be1eeb05c9203a4fbed7f4a3761d989d461ad596c081316379775f1649a59a474adf660b1198c3b179dbe343392eb78b3fe7c6a0f400e53476f7fc1 languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-portal@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-primitive": 1.0.3 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: d352bcd6ad65eb43c9e0d72d0755c2aae85e03fb287770866262be3a2d5302b2885aee3cd99f2bbf62ecd14fcb1460703f1dcdc40351f77ad887b931c6f0012a - languageName: node - linkType: hard - -"@radix-ui/react-primitive@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-primitive@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-slot": 1.0.2 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 9402bc22923c8e5c479051974a721c301535c36521c0237b83e5fa213d013174e77f3ad7905e6d60ef07e14f88ec7f4ea69891dc7a2b39047f8d3640e8f8d713 - languageName: node - linkType: hard - -"@radix-ui/react-roving-focus@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-roving-focus@npm:1.0.4" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-collection": 1.0.3 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-direction": 1.0.1 - "@radix-ui/react-id": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-use-callback-ref": 1.0.1 - "@radix-ui/react-use-controllable-state": 1.0.1 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 69b1c82c2d9db3ba71549a848f2704200dab1b2cd22d050c1e081a78b9a567dbfdc7fd0403ee010c19b79652de69924d8ca2076cd031d6552901e4213493ffc7 - languageName: node - linkType: hard - -"@radix-ui/react-select@npm:^1.2.2": - version: 1.2.2 - resolution: "@radix-ui/react-select@npm:1.2.2" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/number": 1.0.1 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-collection": 1.0.3 - "@radix-ui/react-compose-refs": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-direction": 1.0.1 - "@radix-ui/react-dismissable-layer": 1.0.4 - "@radix-ui/react-focus-guards": 1.0.1 - "@radix-ui/react-focus-scope": 1.0.3 - "@radix-ui/react-id": 1.0.1 - "@radix-ui/react-popper": 1.1.2 - "@radix-ui/react-portal": 1.0.3 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-slot": 1.0.2 - "@radix-ui/react-use-callback-ref": 1.0.1 - "@radix-ui/react-use-controllable-state": 1.0.1 - "@radix-ui/react-use-layout-effect": 1.0.1 - "@radix-ui/react-use-previous": 1.0.1 - "@radix-ui/react-visually-hidden": 1.0.3 - aria-hidden: ^1.1.1 - react-remove-scroll: 2.5.5 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: af7b63cc9e2c6006ec08163392d244941e9e03534e7add1b7c5a86059d0eb8a0398d4f3e80d43ff22126874a02b985e44f1722d1de9218922f7aa653d09412e3 - languageName: node - linkType: hard - -"@radix-ui/react-separator@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-separator@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-primitive": 1.0.3 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 42f8c95e404de2ce9387040d78049808a48d423cd4c3bad8cca92c4b0bcbdcb3566b5b52a920d4e939a74b51188697f20a012221f0e630fc7f56de64096c15d2 - languageName: node - linkType: hard - -"@radix-ui/react-slot@npm:1.0.2": - version: 1.0.2 - resolution: "@radix-ui/react-slot@npm:1.0.2" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-compose-refs": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: edf5edf435ff594bea7e198bf16d46caf81b6fb559493acad4fa8c308218896136acb16f9b7238c788fd13e94a904f2fd0b6d834e530e4cae94522cdb8f77ce9 - languageName: node - linkType: hard - -"@radix-ui/react-toggle-group@npm:1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-toggle-group@npm:1.0.4" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-direction": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-roving-focus": 1.0.4 - "@radix-ui/react-toggle": 1.0.3 - "@radix-ui/react-use-controllable-state": 1.0.1 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: b6c11fbbc3ca857ff68c0fa31f293c0d0111bcc8aa0cde2566214c090907530bfcb3b862f81585c2b02d8989b5c7971acff4d5c07c429870d80bd5602e30d376 - languageName: node - linkType: hard - -"@radix-ui/react-toggle@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-toggle@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-use-controllable-state": 1.0.1 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: ed5407f48254f20cda542017774f259d0b2c0007ea4bd7287d10d751016dbf269cb13d1142591432c269c3ab768cde2f1ba0344743027d36bbec10af909f19de - languageName: node - linkType: hard - -"@radix-ui/react-toolbar@npm:^1.0.4": - version: 1.0.4 - resolution: "@radix-ui/react-toolbar@npm:1.0.4" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/primitive": 1.0.1 - "@radix-ui/react-context": 1.0.1 - "@radix-ui/react-direction": 1.0.1 - "@radix-ui/react-primitive": 1.0.3 - "@radix-ui/react-roving-focus": 1.0.4 - "@radix-ui/react-separator": 1.0.3 - "@radix-ui/react-toggle-group": 1.0.4 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 7ebee1f8add6510108979433c5b38627e2de9d48ef2172ca15274b9edbbc106ff43bcd47ff733b03ed2215b92e7af364ff82c79e5a1728374847e2b1e315552c - languageName: node - linkType: hard - -"@radix-ui/react-use-callback-ref@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-callback-ref@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: b9fd39911c3644bbda14a84e4fca080682bef84212b8d8931fcaa2d2814465de242c4cfd8d7afb3020646bead9c5e539d478cea0a7031bee8a8a3bb164f3bc4c - languageName: node - linkType: hard - -"@radix-ui/react-use-controllable-state@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-controllable-state@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-use-callback-ref": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: dee2be1937d293c3a492cb6d279fc11495a8f19dc595cdbfe24b434e917302f9ac91db24e8cc5af9a065f3f209c3423115b5442e65a5be9fd1e9091338972be9 - languageName: node - linkType: hard - -"@radix-ui/react-use-escape-keydown@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-use-callback-ref": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: c6ed0d9ce780f67f924980eb305af1f6cce2a8acbaf043a58abe0aa3cc551d9aa76ccee14531df89bbee302ead7ecc7fce330886f82d4672c5eda52f357ef9b8 - languageName: node - linkType: hard - -"@radix-ui/react-use-layout-effect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-layout-effect@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: bed9c7e8de243a5ec3b93bb6a5860950b0dba359b6680c84d57c7a655e123dec9b5891c5dfe81ab970652e7779fe2ad102a23177c7896dde95f7340817d47ae5 - languageName: node - linkType: hard - -"@radix-ui/react-use-previous@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-previous@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 66b4312e857c58b75f3bf62a2048ef090b79a159e9da06c19a468c93e62336969c33dbef60ff16969f00b20386cc25d138f6a353f1658b35baac0a6eff4761b9 - languageName: node - linkType: hard - -"@radix-ui/react-use-rect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-rect@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/rect": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 433f07e61e04eb222349825bb05f3591fca131313a1d03709565d6226d8660bd1d0423635553f95ee4fcc25c8f2050972d848808d753c388e2a9ae191ebf17f3 - languageName: node - linkType: hard - -"@radix-ui/react-use-size@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/react-use-size@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-use-layout-effect": 1.0.1 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 6cc150ad1e9fa85019c225c5a5d50a0af6cdc4653dad0c21b4b40cd2121f36ee076db326c43e6bc91a69766ccff5a84e917d27970176b592577deea3c85a3e26 - languageName: node - linkType: hard - -"@radix-ui/react-visually-hidden@npm:1.0.3": - version: 1.0.3 - resolution: "@radix-ui/react-visually-hidden@npm:1.0.3" - dependencies: - "@babel/runtime": ^7.13.10 - "@radix-ui/react-primitive": 1.0.3 - peerDependencies: - "@types/react": "*" - "@types/react-dom": "*" - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 2e9d0c8253f97e7d6ffb2e52a5cfd40ba719f813b39c3e2e42c496d54408abd09ef66b5aec4af9b8ab0553215e32452a5d0934597a49c51dd90dc39181ed0d57 - languageName: node - linkType: hard - -"@radix-ui/rect@npm:1.0.1": - version: 1.0.1 - resolution: "@radix-ui/rect@npm:1.0.1" - dependencies: - "@babel/runtime": ^7.13.10 - checksum: aeec13b234a946052512d05239067d2d63422f9ec70bf2fe7acfd6b9196693fc33fbaf43c2667c167f777d90a095c6604eb487e0bce79e230b6df0f6cacd6a55 - languageName: node - linkType: hard - -"@react-native-async-storage/async-storage@npm:1.17.11": - version: 1.17.11 - resolution: "@react-native-async-storage/async-storage@npm:1.17.11" - dependencies: - merge-options: ^3.0.4 - peerDependencies: - react-native: ^0.0.0-0 || 0.60 - 0.71 || 1000.0.0 - checksum: 691f2b74498160d0b532f673402d8affeecb28b005b1c6d6fa2e7c87f89ab3068177e8e2d2686738306e7592a39c6d7148aa4c426b7e8e149c43a336ad446648 - languageName: node - linkType: hard - -"@react-native-community/cli-clean@npm:^10.1.1": - version: 10.1.1 - resolution: "@react-native-community/cli-clean@npm:10.1.1" - dependencies: - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - execa: ^1.0.0 - prompts: ^2.4.0 - checksum: 2994aa6f0651390af7195742a87d2a79c7970acc7e51e65908d56b288302c531534171563926b91da852550674829c68476e20fdd03cba06406bb28f22bc400e - languageName: node - linkType: hard - -"@react-native-community/cli-config@npm:^10.1.1": - version: 10.1.1 - resolution: "@react-native-community/cli-config@npm:10.1.1" - dependencies: - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - cosmiconfig: ^5.1.0 - deepmerge: ^3.2.0 - glob: ^7.1.3 - joi: ^17.2.1 - checksum: e665f9181eb402d3a9ab5622d19f0c9985ea029df5451c2ae6a3c48126816632d35d5f4d70a8710648428e097933d182b42fac84bae46b49e8c456019802e44e - languageName: node - linkType: hard - -"@react-native-community/cli-debugger-ui@npm:^10.0.0": - version: 10.0.0 - resolution: "@react-native-community/cli-debugger-ui@npm:10.0.0" - dependencies: - serve-static: ^1.13.1 - checksum: 519b395f9d0eabe8c774a6fd776b1e33d75627959768975b14af085a20e3833dc4457e84e7aaf8b48f192b92007055e2017651eb685f625f6d45ed6f6c467641 - languageName: node - linkType: hard - -"@react-native-community/cli-doctor@npm:^10.2.2": - version: 10.2.5 - resolution: "@react-native-community/cli-doctor@npm:10.2.5" - dependencies: - "@react-native-community/cli-config": ^10.1.1 - "@react-native-community/cli-platform-ios": ^10.2.5 - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - command-exists: ^1.2.8 - envinfo: ^7.7.2 - execa: ^1.0.0 - hermes-profile-transformer: ^0.0.6 - ip: ^1.1.5 - node-stream-zip: ^1.9.1 - ora: ^5.4.1 - prompts: ^2.4.0 - semver: ^6.3.0 - strip-ansi: ^5.2.0 - sudo-prompt: ^9.0.0 - wcwidth: ^1.0.1 - checksum: 5189e2031e2f7fe142c90fab97ff7c025da959deae782f12ba0b4f82991d1e076eac32f2713e905c13a7b2400ee3090e2f808b90db1cb60b8845ffbc8eddc6de - languageName: node - linkType: hard - -"@react-native-community/cli-hermes@npm:^10.2.0": - version: 10.2.0 - resolution: "@react-native-community/cli-hermes@npm:10.2.0" - dependencies: - "@react-native-community/cli-platform-android": ^10.2.0 - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - hermes-profile-transformer: ^0.0.6 - ip: ^1.1.5 - checksum: a0dbe70ec4820abd9c4f209e8520473ac8991cfa672127818b3127ebc1daad556f07dc7faf32a293af934e1db96a29a553da81c06758fdc7c66c8ab232b90cea - languageName: node - linkType: hard - -"@react-native-community/cli-platform-android@npm:10.2.0, @react-native-community/cli-platform-android@npm:^10.2.0": - version: 10.2.0 - resolution: "@react-native-community/cli-platform-android@npm:10.2.0" - dependencies: - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - execa: ^1.0.0 - glob: ^7.1.3 - logkitty: ^0.7.1 - checksum: 368b6c016aafce0c969a61e9d9ff84c9ed8ff14c4ef19146dc0e38be1ac0c678af9eb1fa428348ac56c1e3e1eace37aaa1e2a19ee772e636db1122ea9c918e46 - languageName: node - linkType: hard - -"@react-native-community/cli-platform-ios@npm:10.2.1": - version: 10.2.1 - resolution: "@react-native-community/cli-platform-ios@npm:10.2.1" - dependencies: - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - execa: ^1.0.0 - fast-xml-parser: ^4.0.12 - glob: ^7.1.3 - ora: ^5.4.1 - checksum: 17228084eb482dd769eaf872b779be9d901f28645b6888915646a7dd002f9c3317fd92a3b9d3a7744fa8580155aea1b1225a56642e4f31581970ae39a9a12b83 - languageName: node - linkType: hard - -"@react-native-community/cli-platform-ios@npm:^10.2.5": - version: 10.2.5 - resolution: "@react-native-community/cli-platform-ios@npm:10.2.5" - dependencies: - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - execa: ^1.0.0 - fast-xml-parser: ^4.0.12 - glob: ^7.1.3 - ora: ^5.4.1 - checksum: d689359373bfc96f52e4501da6b62f513efddfd5e09ac679d60531926153318080d0538425d95b3889f6e2f1e33951fd48d8956215aecbf35c3d3cafb6884b69 - languageName: node - linkType: hard - -"@react-native-community/cli-plugin-metro@npm:^10.2.2": - version: 10.2.3 - resolution: "@react-native-community/cli-plugin-metro@npm:10.2.3" - dependencies: - "@react-native-community/cli-server-api": ^10.1.1 - "@react-native-community/cli-tools": ^10.1.1 - chalk: ^4.1.2 - execa: ^1.0.0 - metro: 0.73.10 - metro-config: 0.73.10 - metro-core: 0.73.10 - metro-react-native-babel-transformer: 0.73.10 - metro-resolver: 0.73.10 - metro-runtime: 0.73.10 - readline: ^1.3.0 - checksum: a30e0ef50e36adfb5b86a9cd086543e6d43c25e4c47d66517dfcf7c40a6fc08fc32bee17286efebfc9fd877e9396d76e15f9bd20359d187692f0deb8877b9825 - languageName: node - linkType: hard - -"@react-native-community/cli-server-api@npm:^10.1.1": - version: 10.1.1 - resolution: "@react-native-community/cli-server-api@npm:10.1.1" - dependencies: - "@react-native-community/cli-debugger-ui": ^10.0.0 - "@react-native-community/cli-tools": ^10.1.1 - compression: ^1.7.1 - connect: ^3.6.5 - errorhandler: ^1.5.0 - nocache: ^3.0.1 - pretty-format: ^26.6.2 - serve-static: ^1.13.1 - ws: ^7.5.1 - checksum: ce1bf6374a45a677942aecffe3d0ea6671f18b2d694eb39e61592dae596ee98ab936f8e61faaf5b032168919959aad63f932001cf3553c04d87ef16333a4c0ec - languageName: node - linkType: hard - -"@react-native-community/cli-tools@npm:^10.1.1": - version: 10.1.1 - resolution: "@react-native-community/cli-tools@npm:10.1.1" - dependencies: - appdirsjs: ^1.2.4 - chalk: ^4.1.2 - find-up: ^5.0.0 - mime: ^2.4.1 - node-fetch: ^2.6.0 - open: ^6.2.0 - ora: ^5.4.1 - semver: ^6.3.0 - shell-quote: ^1.7.3 - checksum: a70ac3d9f294066db454482b6cadee3613a06cafaf08cd6e24ea941a6936f919672ccb638b8ab8d3ae3ad29c4e7cec64557afcd09ba4d0587eb50b88bd98567b - languageName: node - linkType: hard - -"@react-native-community/cli-types@npm:^10.0.0": - version: 10.0.0 - resolution: "@react-native-community/cli-types@npm:10.0.0" - dependencies: - joi: ^17.2.1 - checksum: 6153088d6be1eeb05c9203a4fbed7f4a3761d989d461ad596c081316379775f1649a59a474adf660b1198c3b179dbe343392eb78b3fe7c6a0f400e53476f7fc1 - languageName: node - linkType: hard - -"@react-native-community/cli@npm:10.2.2": - version: 10.2.2 - resolution: "@react-native-community/cli@npm:10.2.2" +"@react-native-community/cli@npm:10.2.2": + version: 10.2.2 + resolution: "@react-native-community/cli@npm:10.2.2" dependencies: "@react-native-community/cli-clean": ^10.1.1 "@react-native-community/cli-config": ^10.1.1 @@ -7007,6 +6690,20 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/api-client@npm:^0.2.56-rc.2": + version: 0.2.56 + resolution: "@rocket.chat/api-client@npm:0.2.56" + dependencies: + "@rocket.chat/core-typings": ^8.4.0 + "@rocket.chat/rest-typings": ^8.4.0 + filter-obj: ^3.0.0 + query-string: ^7.1.3 + split-on-first: ^3.0.0 + strict-uri-encode: ^2.0.0 + checksum: 638235b735973618b6ab03c9e48b5159cd77993087fd129e06334f8aa1655a7e99e280db3b46f65ae2dfe460fcde05ec4c7e4e52473fb9e115143c3bf46b2b38 + languageName: node + linkType: hard + "@rocket.chat/apps-engine@npm:^1.36.0": version: 1.41.0 resolution: "@rocket.chat/apps-engine@npm:1.41.0" @@ -7025,6 +6722,33 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/core-typings@npm:^8.4.0, @rocket.chat/core-typings@npm:^8.4.1, @rocket.chat/core-typings@npm:~8.4.0-rc.2": + version: 8.4.1 + resolution: "@rocket.chat/core-typings@npm:8.4.1" + dependencies: + "@rocket.chat/icons": ~0.47.0 + "@rocket.chat/message-parser": ^0.31.36 + "@rocket.chat/ui-kit": ~1.0.0 + typia: "patch:typia@npm%3A9.7.2#~/.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch" + zod: ~4.3.6 + checksum: 0c05ac3e20a4c77a22d173188528a69e7b6dbd8ccfd22edabb9eb4589d3cfc74d783e59683fef41101fbb388dea697c70b2306045cc31fb474802076d8ef624e + languageName: node + linkType: hard + +"@rocket.chat/ddp-client@npm:1.0.9-rc.2": + version: 1.0.9-rc.2 + resolution: "@rocket.chat/ddp-client@npm:1.0.9-rc.2" + dependencies: + "@rocket.chat/api-client": ^0.2.56-rc.2 + "@rocket.chat/core-typings": ~8.4.0-rc.2 + "@rocket.chat/media-signaling": ^1.0.0-rc.1 + "@rocket.chat/rest-typings": ^8.4.0-rc.2 + peerDependencies: + "@rocket.chat/emitter": "*" + checksum: b0197b1247bc9dc9a611caa4781b50256920c9c2ec8ca4b4eb304cb73a87832b8156b364c13b0be2152aad1272b5da8fd9b4f19230338b08e3d7ff7b197c0a67 + languageName: node + linkType: hard + "@rocket.chat/emitter@npm:^0.31.25": version: 0.31.25 resolution: "@rocket.chat/emitter@npm:0.31.25" @@ -7032,6 +6756,13 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/emitter@npm:^0.32.0": + version: 0.32.0 + resolution: "@rocket.chat/emitter@npm:0.32.0" + checksum: cf423b52ab01c620e748e089e7645bd2b0b99a921d3c95c7fad1a7ffacbb44a0f2573431c437c9a735d4fb020247356a82eb2f0bba6366e6d55145374811092e + languageName: node + linkType: hard + "@rocket.chat/fuselage-hooks@npm:^0.33.1": version: 0.33.1 resolution: "@rocket.chat/fuselage-hooks@npm:0.33.1" @@ -7051,6 +6782,23 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/icons@npm:~0.47.0": + version: 0.47.0 + resolution: "@rocket.chat/icons@npm:0.47.0" + checksum: 80aacd3e6c4956eb9f93712e2655dbc4dc2f2eb507c74998eb6a1df2823869fd2c7e5b9e89d2ff688d50769a8ec7316fdcdf2cac4b34fb3c114cd3a4577f3a84 + languageName: node + linkType: hard + +"@rocket.chat/media-signaling@npm:^1.0.0-rc.1": + version: 1.0.0 + resolution: "@rocket.chat/media-signaling@npm:1.0.0" + dependencies: + "@rocket.chat/emitter": ^0.32.0 + ajv: ^8.17.1 + checksum: 80676474ee23f7624c47cabfc35b76a69f4a6d8336ff90fa1863de1f077e85275406ba6dee42dc72f0ed5d84f44c354bc57a7fe34e84765dee24806430a21bef + languageName: node + linkType: hard + "@rocket.chat/message-parser@npm:^0.31.29": version: 0.31.29 resolution: "@rocket.chat/message-parser@npm:0.31.29" @@ -7060,16 +6808,25 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/sdk@npm:^1.0.0-alpha.42": - version: 1.0.0-alpha.42 - resolution: "@rocket.chat/sdk@npm:1.0.0-alpha.42" +"@rocket.chat/message-parser@npm:^0.31.36": + version: 0.31.36 + resolution: "@rocket.chat/message-parser@npm:0.31.36" dependencies: - js-sha256: ^0.9.0 - lru-cache: ^4.1.1 - mem: ^4.0.0 - tiny-events: ^1.0.1 - universal-websocket-client: ^1.0.2 - checksum: e54e0a6c7049c3fb14b9d3a7f32a082d6b282d1b77543fc09c22b252daf1c7663da348532de90c96013c8a571471012fea8193e063faf2dc0148c175bd15b3f8 + tldts: ~6.1.86 + checksum: b74f6e0a64da065cd4d881f278a9eddf322cf42f2aaf98e21075464cfb45d62628713f6bb7882b0a0e792928643f8a2385fb7c564d8f64e4cc6fbaa022ff40b4 + languageName: node + linkType: hard + +"@rocket.chat/rest-typings@npm:^8.4.0, @rocket.chat/rest-typings@npm:^8.4.0-rc.2": + version: 8.4.1 + resolution: "@rocket.chat/rest-typings@npm:8.4.1" + dependencies: + "@rocket.chat/core-typings": ^8.4.1 + "@rocket.chat/message-parser": ^0.31.36 + "@rocket.chat/ui-kit": ~1.0.0 + ajv: ^8.17.1 + ajv-formats: ^3.0.1 + checksum: 8e24bde082a57542462777029fadcf5bdf8f0e213109b67f53c2ca7ac6b479fab44d32038b7d985856bd30ec20dc18fa8823b26965f88d3c6ecda6310bda2c43 languageName: node linkType: hard @@ -7082,6 +6839,17 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/ui-kit@npm:~1.0.0": + version: 1.0.0 + resolution: "@rocket.chat/ui-kit@npm:1.0.0" + dependencies: + typia: ~9.7.2 + peerDependencies: + "@rocket.chat/icons": "*" + checksum: f69a0739872fbd4e2fa69bf861f1b3c714269159082303fad1e48de4675ad7afde23ad8bd1dd1aae79dc223f6b65b2fc9cd1d9b9da73bee856e68a92280f93ad + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0, @rollup/plugin-babel@npm:^5.3.1": version: 5.3.1 resolution: "@rollup/plugin-babel@npm:5.3.1" @@ -7381,6 +7149,13 @@ __metadata: languageName: node linkType: hard +"@samchon/openapi@npm:^4.7.1": + version: 4.7.2 + resolution: "@samchon/openapi@npm:4.7.2" + checksum: 1a46d654e5dfd70f8504a01fa127c618e408abcfb0c3e6fc7466f1737bed63b82404482cc6dedf8cd9e827623f1ab0fd79a995ad6a6415397d452b8e07099c5c + languageName: node + linkType: hard + "@segment/loosely-validate-event@npm:^2.0.0": version: 2.0.0 resolution: "@segment/loosely-validate-event@npm:2.0.0" @@ -7494,35 +7269,25 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-actions@npm:7.5.3" +"@standard-schema/spec@npm:^1.0.0": + version: 1.1.0 + resolution: "@standard-schema/spec@npm:1.1.0" + checksum: 6245ebef5e698bb04752a22e996a7cc40406a404d9f68a9d4e1a7a10f2422da287247508e7b495a2f32bb38f3d57b4daf2c9ab4bf22d9bca13e20a3dc5ec575e + languageName: node + linkType: hard + +"@storybook/addon-actions@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-actions@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 + "@types/uuid": ^9.0.1 dequal: ^2.0.2 - lodash: ^4.17.21 polished: ^4.2.2 - prop-types: ^15.7.2 - react-inspector: ^6.0.0 - telejson: ^7.2.0 - ts-dedent: ^2.0.0 uuid: ^9.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: d79baf1da30da5f99d513f08f74093741725c9f865990bf7f99ca2ae171156ab9f11f6c354c32b73d7d9fed13665780cf3a2a7623b7d6877c8dc262dd5616733 + storybook: ^8.6.18 + checksum: 8ea145931f752af5d543f7f4b497f8df2449c8a5a52ccfcea517e513d3b56e1ccb4bec6fa799a03a4d6aeecde4e4fa94a75fc06c89f8524ecdb96ca4001d5935 languageName: node linkType: hard @@ -7561,57 +7326,29 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-backgrounds@npm:7.5.3" +"@storybook/addon-backgrounds@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-backgrounds@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 memoizerific: ^1.11.3 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: 6a432d490a8df336dc419dde7ee28abc3ca3966f2e512c1c3c6479b139f99e294213d832d91e8c8c18c96d3b3acb84299f0789800797d6338e691ee1e9c667fe + storybook: ^8.6.18 + checksum: 91e9c8ba6b0d85052e431acb286011b30810feaf8a4b6e5c15e2c7fd4e7fb727b563fd2fb4c542ac91ca0429f2f4ef6c59d6b2d9cf467ed52d89fec12b12cb4a languageName: node linkType: hard -"@storybook/addon-controls@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-controls@npm:7.5.3" +"@storybook/addon-controls@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-controls@npm:8.6.18" dependencies: - "@storybook/blocks": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/manager-api": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - lodash: ^4.17.21 + "@storybook/global": ^5.0.0 + dequal: ^2.0.2 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: c86f8da8a3a3e1b286826eb7c157991dfb62d9e2d1c4493966beadde5bcf8dec3ff6f88433fec99843b2020a9e025a0635d497abda0bd52b4fdbe0d3bce65638 + storybook: ^8.6.18 + checksum: e481ee3b4973eb1c716ab3507a505d2f2baeee48924912778d44726b3c64b5fb37bfd4d17252002a75b7d2c3b98042121d2f3b223630991f7f8242de2426eb9d languageName: node linkType: hard @@ -7643,148 +7380,94 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-docs@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-docs@npm:7.5.3" +"@storybook/addon-docs@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-docs@npm:8.6.18" dependencies: - "@jest/transform": ^29.3.1 - "@mdx-js/react": ^2.1.5 - "@storybook/blocks": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/csf-plugin": 7.5.3 - "@storybook/csf-tools": 7.5.3 - "@storybook/global": ^5.0.0 - "@storybook/mdx2-csf": ^1.0.0 - "@storybook/node-logger": 7.5.3 - "@storybook/postinstall": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/react-dom-shim": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - fs-extra: ^11.1.0 - remark-external-links: ^8.0.0 - remark-slug: ^6.0.0 + "@mdx-js/react": ^3.0.0 + "@storybook/blocks": 8.6.18 + "@storybook/csf-plugin": 8.6.18 + "@storybook/react-dom-shim": 8.6.18 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 54ef17505cdeb24995131842055256000f2894d7a8e7a46e33c2b29bb4067abdf4a1bc160421729e222fd32d1d77b435fe2afe4d3f9afb32a9ccff7c3d4eeafe - languageName: node - linkType: hard - -"@storybook/addon-essentials@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/addon-essentials@npm:7.5.3" - dependencies: - "@storybook/addon-actions": 7.5.3 - "@storybook/addon-backgrounds": 7.5.3 - "@storybook/addon-controls": 7.5.3 - "@storybook/addon-docs": 7.5.3 - "@storybook/addon-highlight": 7.5.3 - "@storybook/addon-measure": 7.5.3 - "@storybook/addon-outline": 7.5.3 - "@storybook/addon-toolbars": 7.5.3 - "@storybook/addon-viewport": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/manager-api": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/preview-api": 7.5.3 + storybook: ^8.6.18 + checksum: 29cfc27c7ac139d34af3ab414c0187ea99a785533f4b498f7e47147eda02b186112e7df0c0287a17f619a80d16d0daa24400877efd91869a20b6cf52a6571df8 + languageName: node + linkType: hard + +"@storybook/addon-essentials@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-essentials@npm:8.6.18" + dependencies: + "@storybook/addon-actions": 8.6.18 + "@storybook/addon-backgrounds": 8.6.18 + "@storybook/addon-controls": 8.6.18 + "@storybook/addon-docs": 8.6.18 + "@storybook/addon-highlight": 8.6.18 + "@storybook/addon-measure": 8.6.18 + "@storybook/addon-outline": 8.6.18 + "@storybook/addon-toolbars": 8.6.18 + "@storybook/addon-viewport": 8.6.18 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 57341a40f9343f8dab11950c5bd70251e7221048cdf2ef5ac8577586d753988e7f51ce0eaa06a2e216c75412622d70fe9a98f0d2c3eb80d8a699823132c70b88 + storybook: ^8.6.18 + checksum: e43f559b3d19c0cecda0a1a67e4d7f0a14e9f99e1f86d105cffa7d06361b68cee910ba2540b0757d0933662faeeb2aa922bf1cd93b4bc6aca831865d9094edc7 languageName: node linkType: hard -"@storybook/addon-highlight@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-highlight@npm:7.5.3" +"@storybook/addon-highlight@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-highlight@npm:8.6.18" dependencies: - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/preview-api": 7.5.3 - checksum: be468def9a6c3495e72f2c0a15e132b519e909c42e58361fd8d55c1fb1b7764e86b9e0a6531ba0f61b227d9d2ed5646ad294db0729177a39e3da5a7e00a3f2f0 + peerDependencies: + storybook: ^8.6.18 + checksum: 072898fc547f7bf9a84dfe12b7e0699d6c3f94820d914ba29e6ef64049c16b1c092db55b133990cb2876669a7eeaa4b333dd64f6b592e0c01a4d73b5a6f6b87d languageName: node linkType: hard -"@storybook/addon-interactions@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/addon-interactions@npm:7.5.3" +"@storybook/addon-interactions@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-interactions@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/instrumenter": 7.5.3 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - jest-mock: ^27.0.6 + "@storybook/instrumenter": 8.6.18 + "@storybook/test": 8.6.18 polished: ^4.2.2 ts-dedent: ^2.2.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: fec8909767b4d55d00757cae775ddd5eafc9e596293ef7dcbaa378119227e6a3cf1612d94cd3ec30f48ccb9702fefd5a8370498809e2c176df563b064540fcd1 + storybook: ^8.6.18 + checksum: 2f3ba68cf666304ca829920f955ed29e9f686827be12421d4bffec82c932c16650c3ffe091a87bce7baa2fea6b913fbc4a77fcdea9c9df522420ff1bfc61f8da languageName: node linkType: hard -"@storybook/addon-links@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/addon-links@npm:7.5.3" +"@storybook/addon-links@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-links@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/csf": ^0.1.0 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/router": 7.5.3 - "@storybook/types": 7.5.3 - prop-types: ^15.7.2 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.18 peerDependenciesMeta: react: optional: true - react-dom: - optional: true - checksum: cc1f425b8527068b2dd50b268d241201c9b1703358bd7016208e05974931e14bf24ec447b283c74385b4d8b634a985324dabf07444a97e924fdd5446afe67e14 + checksum: 2abd52a9b3628000331101326a9d1158daad27389b84a88deb4e4232eaf14ccdcf44c9d512857c0a8a60b421297015cf686e1410dc9dfdee47f18c4a8642ecce languageName: node linkType: hard -"@storybook/addon-measure@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-measure@npm:7.5.3" +"@storybook/addon-measure@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-measure@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/types": 7.5.3 tiny-invariant: ^1.3.1 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: a0b6cf0a4d42ed9671dcf50df2c33dd5eadf6e1f32de6862ba3d3d507431831bc03c4a5be83566ec445635d2df180657bdc1e1a07a189b5b301c4a543229c8c1 + storybook: ^8.6.18 + checksum: bfbcb57c21bea5e23530012722a7efb17f894682ecc4900eaa3f7959fe5abf2a7b6f05c3a31e26279419fdca29b2da2ade94e235f3be3966c16957ee4b0c6036 languageName: node linkType: hard @@ -7827,118 +7510,45 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-outline@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-outline@npm:7.5.3" +"@storybook/addon-outline@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-outline@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/types": 7.5.3 ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: 07bf04a6427742594fcd8edc323a3a27cf6c249919b4d855725b23a580274bb777877d87fd7dab19829af4e93f5ac3a8f4574a85a852042a4f368e519139ea28 - languageName: node - linkType: hard - -"@storybook/addon-styling@npm:^1.3.6": - version: 1.3.7 - resolution: "@storybook/addon-styling@npm:1.3.7" - dependencies: - "@babel/template": ^7.20.7 - "@babel/types": ^7.21.5 - "@storybook/api": ^7.0.12 - "@storybook/components": ^7.0.12 - "@storybook/core-common": ^7.0.12 - "@storybook/core-events": ^7.0.12 - "@storybook/manager-api": ^7.0.12 - "@storybook/node-logger": ^7.0.12 - "@storybook/preview-api": ^7.0.12 - "@storybook/theming": ^7.0.12 - "@storybook/types": ^7.0.12 - css-loader: ^6.7.3 - less-loader: ^11.1.0 - postcss-loader: ^7.2.4 - prettier: ^2.8.0 - resolve-url-loader: ^5.0.0 - sass-loader: ^13.2.2 - style-loader: ^3.3.2 - peerDependencies: - less: ^3.5.0 || ^4.0.0 - postcss: ^7.0.0 || ^8.0.1 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - webpack: ^5.0.0 - peerDependenciesMeta: - less: - optional: true - postcss: - optional: true - react: - optional: true - react-dom: - optional: true - webpack: - optional: true - bin: - addon-styling-setup: postinstall.js - checksum: 5bac1a4109d15a6371260270518b2eada77ab153ddd0b75bb3c4ae31ee8ea61b6acacbf258add5166ae8b8450654fffc6be105c08c2b0ebdc2540abf6dba15a1 + storybook: ^8.6.18 + checksum: 8f699c4e46756000ed07eab292475937798d05c3b4b9671642b899e2fc9558e5a716f5e0c7907f1e457b791dbf0582a4a102cc8ca40c08e752c11826c4310088 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-toolbars@npm:7.5.3" - dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 +"@storybook/addon-toolbars@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-toolbars@npm:8.6.18" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: c61d953a53dd0eb23f3dfcb52b4227d3e3aa6b8bbd8260007b2334ceb2dc3910aa0633f18858e8caac0027b7badc57937a2094219c0f29ae414ce5c705b7a0bb + storybook: ^8.6.18 + checksum: ad02027a3400e7332c343b7caf20133cf0eb89ec758f045821db5616e6e1656d3b66f20d55d4621c2a7d2b4217309f080339938b3e12df811fe98c026ebbdd86 languageName: node linkType: hard -"@storybook/addon-viewport@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/addon-viewport@npm:7.5.3" +"@storybook/addon-viewport@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/addon-viewport@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 memoizerific: ^1.11.3 - prop-types: ^15.7.2 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - checksum: 4b324c9edcc96ba72573093934d862005e20265dbd1e3a4430f07ecab7c1ee577e01a5a7b75907e2ab89fcb59c80dede5f16e6a6795426219170529baff654af + storybook: ^8.6.18 + checksum: 184ecf4a438bbf6e5c1098378319fcc548ef9a86fc86498939d55a222d6c3f29c8791df72dc8a6259f2e0462476d2342fc38ee409997999271088d7a83295094 + languageName: node + linkType: hard + +"@storybook/addon-webpack5-compiler-babel@npm:~3.0.0": + version: 3.0.6 + resolution: "@storybook/addon-webpack5-compiler-babel@npm:3.0.6" + dependencies: + "@babel/core": ^7.26.0 + babel-loader: ^9.2.1 + checksum: 5e5bf0c5c9369bd307aa32902225822bffb62dad83fc1a7ae0de2a5ed5be8ca46ca48a7c961c17693cb77c97a88b882178ddaaa0578f44693e325d78045a610d languageName: node linkType: hard @@ -7992,126 +7602,59 @@ __metadata: languageName: node linkType: hard -"@storybook/api@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/api@npm:7.5.3" +"@storybook/blocks@npm:8.6.18, @storybook/blocks@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/blocks@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/manager-api": 7.5.3 + "@storybook/icons": ^1.2.12 + ts-dedent: ^2.0.0 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^8.6.18 peerDependenciesMeta: react: optional: true react-dom: optional: true - checksum: 14c28a8564811001d82e2e8c4c2be0120d181bae9d8ad278c3b60f01d28857bcdf6e84c9c57d3efa1335173635346a212fac36d9cfb441622c0c556417b3e71d - languageName: node - linkType: hard - -"@storybook/blocks@npm:7.5.3, @storybook/blocks@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/blocks@npm:7.5.3" - dependencies: - "@storybook/channels": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/components": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/csf": ^0.1.0 - "@storybook/docs-tools": 7.5.3 - "@storybook/global": ^5.0.0 - "@storybook/manager-api": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - "@types/lodash": ^4.14.167 - color-convert: ^2.0.1 - dequal: ^2.0.2 - lodash: ^4.17.21 - markdown-to-jsx: ^7.1.8 - memoizerific: ^1.11.3 - polished: ^4.2.2 - react-colorful: ^5.1.2 - telejson: ^7.2.0 - tocbot: ^4.20.1 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 0b7506a52903ab319280e3af77a8e72c53d229df75187fe1d60330a903fc8926e09b7cc9debea1395afa8698c11050900f41ca24ac852bf93790e322affbfcdb - languageName: node - linkType: hard - -"@storybook/builder-manager@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/builder-manager@npm:7.5.3" - dependencies: - "@fal-works/esbuild-plugin-global-externals": ^2.1.2 - "@storybook/core-common": 7.5.3 - "@storybook/manager": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@types/ejs": ^3.1.1 - "@types/find-cache-dir": ^3.2.1 - "@yarnpkg/esbuild-plugin-pnp": ^3.0.0-rc.10 - browser-assert: ^1.2.1 - ejs: ^3.1.8 - esbuild: ^0.18.0 - esbuild-plugin-alias: ^0.2.1 - express: ^4.17.3 - find-cache-dir: ^3.0.0 - fs-extra: ^11.1.0 - process: ^0.11.10 - util: ^0.12.4 - checksum: dab636019edb2c9ff350c340a8722b49a61f013f90315a616f668175c441cee39a62308909fbf1e2429c14277809dd78a8322c16d8e7a5ab1fc7c3363ff19d98 + checksum: b1d2d6db7de9c193897b713647dc59673116cd56b9651d7278f59af6ddbe15f5c85d1064700249bb915aed18e403ae0c93664e88d01449ba9cef7b43e2b9faad languageName: node linkType: hard -"@storybook/builder-webpack5@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/builder-webpack5@npm:7.5.3" +"@storybook/builder-webpack5@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/builder-webpack5@npm:8.6.18" dependencies: - "@babel/core": ^7.22.0 - "@storybook/channels": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/core-webpack": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/preview": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@swc/core": ^1.3.82 - "@types/node": ^18.0.0 + "@storybook/core-webpack": 8.6.18 "@types/semver": ^7.3.4 - babel-loader: ^9.0.0 - babel-plugin-named-exports-order: ^0.0.2 browser-assert: ^1.2.1 case-sensitive-paths-webpack-plugin: ^2.4.0 + cjs-module-lexer: ^1.2.3 constants-browserify: ^1.0.0 css-loader: ^6.7.1 - express: ^4.17.3 + es-module-lexer: ^1.5.0 fork-ts-checker-webpack-plugin: ^8.0.0 - fs-extra: ^11.1.0 html-webpack-plugin: ^5.5.0 + magic-string: ^0.30.5 path-browserify: ^1.0.1 process: ^0.11.10 semver: ^7.3.7 style-loader: ^3.3.1 - swc-loader: ^0.2.3 terser-webpack-plugin: ^5.3.1 ts-dedent: ^2.0.0 url: ^0.11.0 util: ^0.12.4 util-deprecate: ^1.0.2 webpack: 5 - webpack-dev-middleware: ^6.1.1 + webpack-dev-middleware: ^6.1.2 webpack-hot-middleware: ^2.25.1 - webpack-virtual-modules: ^0.5.0 + webpack-virtual-modules: ^0.6.0 + peerDependencies: + storybook: ^8.6.18 peerDependenciesMeta: typescript: optional: true - checksum: 702175697c0f7e52c3c690b493fe06657cbb081c58e71567054f236e7521b7c421bef5876bcc9516d9ff99a570316477d1d57134c0fc4d0a9342bc153442207f + checksum: 64186ecadd1b8f9c5aeabf5eff44d3a464786b6feca98b99bdd48da5570507bf99da192e7634c1aa2b44c41c295dfe77f361bab7a1cd4a413de2ec810e95a133 languageName: node linkType: hard @@ -8154,72 +7697,6 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/channels@npm:7.5.3" - dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/global": ^5.0.0 - qs: ^6.10.0 - telejson: ^7.2.0 - tiny-invariant: ^1.3.1 - checksum: 1d354798d977b1f52dfa457e40352f38776016af7c6239dd6348cd80206df774401f9a7858bde72cb9f7be3d93e3bbc537eb3c07187a337559c60c65f962c1da - languageName: node - linkType: hard - -"@storybook/cli@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/cli@npm:7.5.3" - dependencies: - "@babel/core": ^7.22.9 - "@babel/preset-env": ^7.22.9 - "@babel/types": ^7.22.5 - "@ndelangen/get-tarball": ^3.0.7 - "@storybook/codemod": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/core-server": 7.5.3 - "@storybook/csf-tools": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/telemetry": 7.5.3 - "@storybook/types": 7.5.3 - "@types/semver": ^7.3.4 - "@yarnpkg/fslib": 2.10.3 - "@yarnpkg/libzip": 2.3.0 - chalk: ^4.1.0 - commander: ^6.2.1 - cross-spawn: ^7.0.3 - detect-indent: ^6.1.0 - envinfo: ^7.7.3 - execa: ^5.0.0 - express: ^4.17.3 - find-up: ^5.0.0 - fs-extra: ^11.1.0 - get-npm-tarball-url: ^2.0.3 - get-port: ^5.1.1 - giget: ^1.0.0 - globby: ^11.0.2 - jscodeshift: ^0.14.0 - leven: ^3.1.0 - ora: ^5.4.1 - prettier: ^2.8.0 - prompts: ^2.4.0 - puppeteer-core: ^2.1.1 - read-pkg-up: ^7.0.1 - semver: ^7.3.7 - simple-update-notifier: ^2.0.0 - strip-json-comments: ^3.0.1 - tempy: ^1.0.1 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - bin: - getstorybook: ./bin/index.js - sb: ./bin/index.js - checksum: 1c65a342719e8da45dfe932c48fcfbfabb315e6c850ba0ee04193253ac766aaca9b2c8661e639c3f777d325d5bab3c80fc378f2fe20756f6512c6d960e4f9f8c - languageName: node - linkType: hard - "@storybook/client-api@npm:6.5.16, @storybook/client-api@npm:^6.5.14": version: 6.5.16 resolution: "@storybook/client-api@npm:6.5.16" @@ -8261,37 +7738,6 @@ __metadata: languageName: node linkType: hard -"@storybook/client-logger@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/client-logger@npm:7.5.3" - dependencies: - "@storybook/global": ^5.0.0 - checksum: 0931daa2274f93dc1921e0c48cfb3a938b4c88843327e832c49115ea0aaa48ee5ddaeb37dc51ba0c7daac84215d62a9101befbfbf0088ce272396eb6c3f1d046 - languageName: node - linkType: hard - -"@storybook/codemod@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/codemod@npm:7.5.3" - dependencies: - "@babel/core": ^7.22.9 - "@babel/preset-env": ^7.22.9 - "@babel/types": ^7.22.5 - "@storybook/csf": ^0.1.0 - "@storybook/csf-tools": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/types": 7.5.3 - "@types/cross-spawn": ^6.0.2 - cross-spawn: ^7.0.3 - globby: ^11.0.2 - jscodeshift: ^0.14.0 - lodash: ^4.17.21 - prettier: ^2.8.0 - recast: ^0.23.1 - checksum: e701293d237c9f05dd2237cca77528c87412eeff3df516e7ab41b19521198855bf74347bc252a19ce4966d6727d4d9b9b49482917445d53e7fa1cdb3e49f1b29 - languageName: node - linkType: hard - "@storybook/components@npm:6.5.16": version: 6.5.16 resolution: "@storybook/components@npm:6.5.16" @@ -8311,34 +7757,12 @@ __metadata: languageName: node linkType: hard -"@storybook/components@npm:7.5.3, @storybook/components@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/components@npm:7.5.3" - dependencies: - "@radix-ui/react-select": ^1.2.2 - "@radix-ui/react-toolbar": ^1.0.4 - "@storybook/client-logger": 7.5.3 - "@storybook/csf": ^0.1.0 - "@storybook/global": ^5.0.0 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - memoizerific: ^1.11.3 - use-resize-observer: ^9.1.0 - util-deprecate: ^1.0.2 +"@storybook/components@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/components@npm:8.6.18" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: a73dbc33e0767b3152fa075e632635ba3bb2ab41917969ebd6c82790e47bc414832f5bd50be7d0a9f9d598b6241b96226eb0fe3f0da4c98ea2d6ccf439a86875 - languageName: node - linkType: hard - -"@storybook/core-client@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/core-client@npm:7.5.3" - dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/preview-api": 7.5.3 - checksum: 9533de3f66516c223d90ba7a6a61c9aceab0cf19553d8499b9165f286fcb17a326581f5ef963161d6b18dee2640a6e0175f6ed579a0c21036e6d0993a5706a7f + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 5f14142b7c1ebdc91873f4d530ec50ce67ae264e9ffc1359fa9731139a1de4c77bb43188a894c211bdd631747c0931529d1df1c681bcf49a17c717553d5b4f3a languageName: node linkType: hard @@ -8441,37 +7865,6 @@ __metadata: languageName: node linkType: hard -"@storybook/core-common@npm:7.5.3, @storybook/core-common@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/core-common@npm:7.5.3" - dependencies: - "@storybook/core-events": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/types": 7.5.3 - "@types/find-cache-dir": ^3.2.1 - "@types/node": ^18.0.0 - "@types/node-fetch": ^2.6.4 - "@types/pretty-hrtime": ^1.0.0 - chalk: ^4.1.0 - esbuild: ^0.18.0 - esbuild-register: ^3.5.0 - file-system-cache: 2.3.0 - find-cache-dir: ^3.0.0 - find-up: ^5.0.0 - fs-extra: ^11.1.0 - glob: ^10.0.0 - handlebars: ^4.7.7 - lazy-universal-dotenv: ^4.0.0 - node-fetch: ^2.0.0 - picomatch: ^2.3.0 - pkg-dir: ^5.0.0 - pretty-hrtime: ^1.0.3 - resolve-from: ^5.0.0 - ts-dedent: ^2.0.0 - checksum: 152816728cb1c3c14038509c9f7da78331bb91fb0ab766fff25651c9c91e246617f78e9bd4ec6adae21bd3c92c2cfdfbaf5162fedf83b2e8725970a5ac3b28d4 - languageName: node - linkType: hard - "@storybook/core-events@npm:6.5.16, @storybook/core-events@npm:^6.5.14": version: 6.5.16 resolution: "@storybook/core-events@npm:6.5.16" @@ -8481,101 +7874,49 @@ __metadata: languageName: node linkType: hard -"@storybook/core-events@npm:7.5.3, @storybook/core-events@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/core-events@npm:7.5.3" +"@storybook/core-webpack@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/core-webpack@npm:8.6.18" dependencies: ts-dedent: ^2.0.0 - checksum: 7f59f1fe5b5389b7f022fb68a295c80a6bf737d3bdd9233923a2efb042fd966b0a7c980467edcc2e3d5cf451ba080be54b84353f645cd868bbad9868f3c28d92 + peerDependencies: + storybook: ^8.6.18 + checksum: 279ec75a6bca1c360ee026f6425f9facd8b548ebfc88b894a8c62cacf3ecfcbcb3256f3d2f70214c0a79627e7db22f7e05d27f6ba090bf0138a350b1d50eb029 languageName: node linkType: hard -"@storybook/core-server@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/core-server@npm:7.5.3" +"@storybook/core@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/core@npm:8.6.18" dependencies: - "@aw-web-design/x-default-browser": 1.4.126 - "@discoveryjs/json-ext": ^0.5.3 - "@storybook/builder-manager": 7.5.3 - "@storybook/channels": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/csf": ^0.1.0 - "@storybook/csf-tools": 7.5.3 - "@storybook/docs-mdx": ^0.1.0 - "@storybook/global": ^5.0.0 - "@storybook/manager": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/telemetry": 7.5.3 - "@storybook/types": 7.5.3 - "@types/detect-port": ^1.3.0 - "@types/node": ^18.0.0 - "@types/pretty-hrtime": ^1.0.0 - "@types/semver": ^7.3.4 + "@storybook/theming": 8.6.18 better-opn: ^3.0.2 - chalk: ^4.1.0 - cli-table3: ^0.6.1 - compression: ^1.7.4 - detect-port: ^1.3.0 - express: ^4.17.3 - fs-extra: ^11.1.0 - globby: ^11.0.2 - ip: ^2.0.0 - lodash: ^4.17.21 - open: ^8.4.0 - pretty-hrtime: ^1.0.3 - prompts: ^2.4.0 - read-pkg-up: ^7.0.1 - semver: ^7.3.7 - telejson: ^7.2.0 - tiny-invariant: ^1.3.1 - ts-dedent: ^2.0.0 - util: ^0.12.4 - util-deprecate: ^1.0.2 - watchpack: ^2.2.0 + browser-assert: ^1.2.1 + esbuild: ^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 + esbuild-register: ^3.5.0 + jsdoc-type-pratt-parser: ^4.0.0 + process: ^0.11.10 + recast: ^0.23.5 + semver: ^7.6.2 + util: ^0.12.5 ws: ^8.2.3 - checksum: 8d5da882230ceba7a35e769ccf5da0ac3964ad22ae14f8f2aed67ee84d916d3e4ff74dfd18e29eb59df18991a113f73f8b99ab16c772153100f57573595c3c71 - languageName: node - linkType: hard - -"@storybook/core-webpack@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/core-webpack@npm:7.5.3" - dependencies: - "@storybook/core-common": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/types": 7.5.3 - "@types/node": ^18.0.0 - ts-dedent: ^2.0.0 - checksum: b40bc908e4bd60fe57b6296098605c5ca5fe3fa2605a1d8ae20a69dec9e98022bdacffad59211bcba8539ed9926da57799610b7f0ec6fa1ee3858e2ef46a03ec + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true + checksum: 1012f3ba84f093bb848c152a69cb9ec5d0ab0c86833767a65270a9529a67292898a480883f142cac6138d409fb91a6eaf6dee169941f690511bd2b4e553c1a62 languageName: node linkType: hard -"@storybook/csf-plugin@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/csf-plugin@npm:7.5.3" +"@storybook/csf-plugin@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/csf-plugin@npm:8.6.18" dependencies: - "@storybook/csf-tools": 7.5.3 unplugin: ^1.3.1 - checksum: 3252d8834e60b73fcb81601035e48b3847a1fdbef6ccce040b2685b100ca37c9faee4789124367c97e0a4cc018db323aa4f639ca1200b7921ef450276dd5d60e - languageName: node - linkType: hard - -"@storybook/csf-tools@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/csf-tools@npm:7.5.3" - dependencies: - "@babel/generator": ^7.22.9 - "@babel/parser": ^7.22.7 - "@babel/traverse": ^7.22.8 - "@babel/types": ^7.22.5 - "@storybook/csf": ^0.1.0 - "@storybook/types": 7.5.3 - fs-extra: ^11.1.0 - recast: ^0.23.1 - ts-dedent: ^2.0.0 - checksum: 32867878a588feb03701dedb1dbb65f18aaf64d464c642fb68efa4bc6ad35b0bbfdbf452fdf38b997a8139af50ee44f5dc20c27d1fb3870bc4ef66b84a41c457 + peerDependencies: + storybook: ^8.6.18 + checksum: e47b36c43329cb74a8f97b8620fe418bf1298e7cc193d643884816b4c5fa7462e4de27a03dba926b0a289fe8b22f48cf6a39a7d0bbca9b68d9651480c9371329 languageName: node linkType: hard @@ -8597,36 +7938,6 @@ __metadata: languageName: node linkType: hard -"@storybook/csf@npm:^0.1.0": - version: 0.1.1 - resolution: "@storybook/csf@npm:0.1.1" - dependencies: - type-fest: ^2.19.0 - checksum: 1fbb827b50f0c15f21026a95d02cc096be4f9f2705ad8fd29f0a99330233606e69f6af7551d844ace2a4b8f08fcc9f81496d4d69160ba8c458698291efb60954 - languageName: node - linkType: hard - -"@storybook/docs-mdx@npm:^0.1.0": - version: 0.1.0 - resolution: "@storybook/docs-mdx@npm:0.1.0" - checksum: a7770842c3947a761bcbe776a9c4fd35163d30c3274fca034169f69ff614242eaa4cacaa2c95fd215827081ef9a43f4774d521a6f43a4d063ea5f4ea14b1d69a - languageName: node - linkType: hard - -"@storybook/docs-tools@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/docs-tools@npm:7.5.3" - dependencies: - "@storybook/core-common": 7.5.3 - "@storybook/preview-api": 7.5.3 - "@storybook/types": 7.5.3 - "@types/doctrine": ^0.0.3 - doctrine: ^3.0.0 - lodash: ^4.17.21 - checksum: 27d8e55927751a0ad553e1af2b173f186f0b5ef36055a462d2e098eb79bd786844fbc45d1c6e1d98dc89506abc2138a559852f7e10ce252ee8e5bd9a8d010521 - languageName: node - linkType: hard - "@storybook/global@npm:^5.0.0": version: 5.0.0 resolution: "@storybook/global@npm:5.0.0" @@ -8634,56 +7945,34 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/instrumenter@npm:7.5.3" - dependencies: - "@storybook/channels": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/global": ^5.0.0 - "@storybook/preview-api": 7.5.3 - checksum: 32a63211babe6ccd43270ec2d566b84c735e5d9e9e0112ecff7fc43e4d170fdd90f7644e9c999e2cd4d2cba8911a2d7dd648cc8771d8ec0fb4759ddde254054b +"@storybook/icons@npm:^1.2.12": + version: 1.6.0 + resolution: "@storybook/icons@npm:1.6.0" + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + checksum: 3bfe4f46ea769f1af8c9b9b3960a4e068761790849636965b185bd212f21979712d7dc47095b686f9d8e80696812d5e4f44518de76ae051be42a32d2981b3c14 languageName: node linkType: hard -"@storybook/manager-api@npm:7.5.3, @storybook/manager-api@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/manager-api@npm:7.5.3" +"@storybook/instrumenter@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/instrumenter@npm:8.6.18" dependencies: - "@storybook/channels": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/csf": ^0.1.0 "@storybook/global": ^5.0.0 - "@storybook/router": 7.5.3 - "@storybook/theming": 7.5.3 - "@storybook/types": 7.5.3 - dequal: ^2.0.2 - lodash: ^4.17.21 - memoizerific: ^1.11.3 - semver: ^7.3.7 - store2: ^2.14.2 - telejson: ^7.2.0 - ts-dedent: ^2.0.0 + "@vitest/utils": ^2.1.1 peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 82bb352a4e39f1035d969c584ff2c97c693f9b392b402ce7010507788f06c9a0024d1c23909f501a6524db0b393c26eb2361ba1c0374c62fa84c2b8a5bf2a4d5 - languageName: node - linkType: hard - -"@storybook/manager@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/manager@npm:7.5.3" - checksum: 8f508f09a8a4bf662eeba6eea7eb0cf07e8590e1b8d2c82490bb21f5ce6e31937890de8fd9aac2b739bfc476fa5e445d3ad9d147d135d950bc9f3a9c7e638a77 + storybook: ^8.6.18 + checksum: d6ee42f63f3558740a71d34e7f8ba06e8f029ec8481cc05af46fdde4b105a41770fa25e7c217a9edd7069e534933ce6492858e50059fd5c9772f581fbd5f1cfb languageName: node linkType: hard -"@storybook/mdx2-csf@npm:^1.0.0": - version: 1.1.0 - resolution: "@storybook/mdx2-csf@npm:1.1.0" - checksum: 5ccdb13f4e59b989499f76e54ffaffb96b5710a696346efe19989b3373f375703adf516780894b270fa64a7e765b55274dc18575fc4a84e7fa92b844a4467c5d +"@storybook/manager-api@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/manager-api@npm:8.6.18" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 40176c8536671fd6506062bdd6bf3eabcf1a664d7fadbab11fab389558ec5a1e094835e35fa771de0bbe4817ce5672af40703908fcc3e00c54a0586b7af653d1 languageName: node linkType: hard @@ -8700,72 +7989,38 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:7.5.3, @storybook/node-logger@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/node-logger@npm:7.5.3" - checksum: 9dec669a9a0d9862ca5f835a23b1b22b62eee5b74ff9a8759d323a06893baa9bdc2305c62f067ca5cbc80df017e564b8304bc9d161821780f32c77667601f76c - languageName: node - linkType: hard - -"@storybook/postinstall@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/postinstall@npm:7.5.3" - checksum: 66e54ca864449c5c436f8c3260b3f78dad8844fc3dc2e73174ad186c64dfbf0b11020993e858abdc7e411906273957e819af899c96dd507603a1566359900f57 - languageName: node - linkType: hard - -"@storybook/preset-react-webpack@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/preset-react-webpack@npm:7.5.3" +"@storybook/preset-react-webpack@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/preset-react-webpack@npm:8.6.18" dependencies: - "@babel/preset-flow": ^7.22.5 - "@babel/preset-react": ^7.22.5 - "@pmmmwh/react-refresh-webpack-plugin": ^0.5.5 - "@storybook/core-webpack": 7.5.3 - "@storybook/docs-tools": 7.5.3 - "@storybook/node-logger": 7.5.3 - "@storybook/react": 7.5.3 + "@storybook/core-webpack": 8.6.18 + "@storybook/react": 8.6.18 "@storybook/react-docgen-typescript-plugin": 1.0.6--canary.9.0c3f3b7.0 - "@types/node": ^18.0.0 "@types/semver": ^7.3.4 - babel-plugin-add-react-displayname: ^0.0.5 - babel-plugin-react-docgen: ^4.2.1 - fs-extra: ^11.1.0 - react-refresh: ^0.11.0 + find-up: ^5.0.0 + magic-string: ^0.30.5 + react-docgen: ^7.0.0 + resolve: ^1.22.8 semver: ^7.3.7 + tsconfig-paths: ^4.2.0 webpack: 5 peerDependencies: - "@babel/core": ^7.22.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.18 peerDependenciesMeta: - "@babel/core": - optional: true typescript: optional: true - checksum: ffc06e17b5347204a82c600694968d7df0fc38d312c7118f8ae9b064d9ffb943fcb1608ccc38d5a2d2e81fd22372287e6dc78ed5368cce0b6fe1fd476a580ddd + checksum: c8e8ce4c10e7838c666599ddf0260e95742964ac1ad19a8ec54b785c9e36502d823eefeeb764a7d4118408ef8dddae2c86227b5f4c5b06277c8a5a2274a92541 languageName: node linkType: hard -"@storybook/preview-api@npm:7.5.3, @storybook/preview-api@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/preview-api@npm:7.5.3" - dependencies: - "@storybook/channels": 7.5.3 - "@storybook/client-logger": 7.5.3 - "@storybook/core-events": 7.5.3 - "@storybook/csf": ^0.1.0 - "@storybook/global": ^5.0.0 - "@storybook/types": 7.5.3 - "@types/qs": ^6.9.5 - dequal: ^2.0.2 - lodash: ^4.17.21 - memoizerific: ^1.11.3 - qs: ^6.10.0 - synchronous-promise: ^2.0.15 - ts-dedent: ^2.0.0 - util-deprecate: ^1.0.2 - checksum: 9e75ad27a031c4b17200ffc815452d3379c6a3ef28c21ca4c389521d433be6a217f2a84ee7c38b5562c31783c31101d939233053e2634f62fe1f30e39fd1fcde +"@storybook/preview-api@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/preview-api@npm:8.6.18" + peerDependencies: + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: 4d2ca71644f2fd1ccb5d5277aab5a29651749304f733c2a814b98a1bc63d020f4d50459128b3f619c7e4fdef24af732a17bcab52ea388ee3eb678aded8d9fe29 languageName: node linkType: hard @@ -8796,13 +8051,6 @@ __metadata: languageName: node linkType: hard -"@storybook/preview@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/preview@npm:7.5.3" - checksum: 4eac804aff380e7d4e7dbdc1721595056de06bff60a9a57d2d00c9dd1ec8fb58fd97f1a346822af5294148a4fa14f3f924c26b7f672711609a5c190b2e8b7003 - languageName: node - linkType: hard - "@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0": version: 1.0.6--canary.9.0c3f3b7.0 resolution: "@storybook/react-docgen-typescript-plugin@npm:1.0.6--canary.9.0c3f3b7.0" @@ -8821,13 +8069,14 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/react-dom-shim@npm:7.5.3" +"@storybook/react-dom-shim@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/react-dom-shim@npm:8.6.18" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 41071d4102202d5965fb3f7068c4864160d98f63ddac67693e1bf8126de1d520968d1c094873dd8564165e7f9c35bb7c4894972047d8378f70a0b2f3c80485fe + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.18 + checksum: 2310d076fb454fccf2f71f8f7f531b61ec263722fa1aae3594be192a0c58cc73d7902a4ac75402eb54eb13bf20194473c7aea9858d440491bb1c8c0e9aa69129 languageName: node linkType: hard @@ -8875,61 +8124,47 @@ __metadata: languageName: node linkType: hard -"@storybook/react-webpack5@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/react-webpack5@npm:7.5.3" +"@storybook/react-webpack5@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/react-webpack5@npm:8.6.18" dependencies: - "@storybook/builder-webpack5": 7.5.3 - "@storybook/preset-react-webpack": 7.5.3 - "@storybook/react": 7.5.3 - "@types/node": ^18.0.0 + "@storybook/builder-webpack5": 8.6.18 + "@storybook/preset-react-webpack": 8.6.18 + "@storybook/react": 8.6.18 peerDependencies: - "@babel/core": ^7.22.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.18 + typescript: ">= 4.2.x" peerDependenciesMeta: - "@babel/core": - optional: true typescript: optional: true - checksum: b30b1abbad54a4204f4e826fd03171555c9a228f737be4511367d9cd6d91cd9c806442287c3c4f0d7dd106f074e0b4d9fd15d5a1a3d9b39d1e96819c91a54830 + checksum: f38dec3985f10f2c2d2088e6bd1fd2c8c8733af076ab4d1ffad21e518e8f59294b73eb6099fbfd890d177239ad017b040bfddd2ff24f94e133a4508a096c1b97 languageName: node linkType: hard -"@storybook/react@npm:7.5.3, @storybook/react@npm:^7.0.26": - version: 7.5.3 - resolution: "@storybook/react@npm:7.5.3" +"@storybook/react@npm:8.6.18, @storybook/react@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/react@npm:8.6.18" dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/core-client": 7.5.3 - "@storybook/docs-tools": 7.5.3 + "@storybook/components": 8.6.18 "@storybook/global": ^5.0.0 - "@storybook/preview-api": 7.5.3 - "@storybook/react-dom-shim": 7.5.3 - "@storybook/types": 7.5.3 - "@types/escodegen": ^0.0.6 - "@types/estree": ^0.0.51 - "@types/node": ^18.0.0 - acorn: ^7.4.1 - acorn-jsx: ^5.3.1 - acorn-walk: ^7.2.0 - escodegen: ^2.1.0 - html-tags: ^3.1.0 - lodash: ^4.17.21 - prop-types: ^15.7.2 - react-element-to-jsx-string: ^15.0.0 - ts-dedent: ^2.0.0 - type-fest: ~2.19 - util-deprecate: ^1.0.2 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - typescript: "*" + "@storybook/manager-api": 8.6.18 + "@storybook/preview-api": 8.6.18 + "@storybook/react-dom-shim": 8.6.18 + "@storybook/theming": 8.6.18 + peerDependencies: + "@storybook/test": 8.6.18 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.18 + typescript: ">= 4.2.x" peerDependenciesMeta: + "@storybook/test": + optional: true typescript: optional: true - checksum: 0b931d4feb424bea501bd4977f9b61479d0bbe550998d4537e2c0370b39bc66e604f0408a063477641f9d65fde1e88702154b94ca16e00b9d023c44bc72925bf + checksum: 3f29fdec39c4e569125444d4f0ebccdecf2c976557520bf5b314489552fc3096cc5a5103f0256201c94031b12aa949b4485f5801ca94e2bff5e7a226a622454a languageName: node linkType: hard @@ -8949,20 +8184,6 @@ __metadata: languageName: node linkType: hard -"@storybook/router@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/router@npm:7.5.3" - dependencies: - "@storybook/client-logger": 7.5.3 - memoizerific: ^1.11.3 - qs: ^6.10.0 - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 7c7c9a6f6e0ff6a46ab284c94e33398364115f6c4e06bbab89df770efeb654819fced83e5f37c627af91b620134c9c09fcdc112bc24698350dd8f6e2fbeaeaf4 - languageName: node - linkType: hard - "@storybook/semver@npm:^7.3.2": version: 7.3.2 resolution: "@storybook/semver@npm:7.3.2" @@ -9001,30 +8222,20 @@ __metadata: languageName: node linkType: hard -"@storybook/telemetry@npm:7.5.3": - version: 7.5.3 - resolution: "@storybook/telemetry@npm:7.5.3" - dependencies: - "@storybook/client-logger": 7.5.3 - "@storybook/core-common": 7.5.3 - "@storybook/csf-tools": 7.5.3 - chalk: ^4.1.0 - detect-package-manager: ^2.0.1 - fetch-retry: ^5.0.2 - fs-extra: ^11.1.0 - read-pkg-up: ^7.0.1 - checksum: b031ace4e1b3c01ea43d132de01f49393007344abf98ab496e2b74bb0e15372b92bf98754fb81095ba66861ac570e730b2ed637f686e5261ece0a4ad9901db63 - languageName: node - linkType: hard - -"@storybook/testing-library@npm:^0.2.0": - version: 0.2.2 - resolution: "@storybook/testing-library@npm:0.2.2" +"@storybook/test@npm:8.6.18, @storybook/test@npm:^8.6.18": + version: 8.6.18 + resolution: "@storybook/test@npm:8.6.18" dependencies: - "@testing-library/dom": ^9.0.0 - "@testing-library/user-event": ^14.4.0 - ts-dedent: ^2.2.0 - checksum: 8ccdc1fbbb3472264c56b0aaf2f1c5d273f1ae9b230a53adf9cf82bf82c1a555550894f0e8869c206fa07b1fe8423da4d56590377756c58de3ec560b35a96c46 + "@storybook/global": ^5.0.0 + "@storybook/instrumenter": 8.6.18 + "@testing-library/dom": 10.4.0 + "@testing-library/jest-dom": 6.5.0 + "@testing-library/user-event": 14.5.2 + "@vitest/expect": 2.0.5 + "@vitest/spy": 2.0.5 + peerDependencies: + storybook: ^8.6.18 + checksum: d6edef2cd975f74edb679466158fe1c888d0b29a0411e0858d404e0f8f5d05495c6fec2ae0a086e9e5453256f36fee7d91cb4488a152ac5d66cc4476c7cc8593 languageName: node linkType: hard @@ -9043,30 +8254,12 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:7.5.3, @storybook/theming@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/theming@npm:7.5.3" - dependencies: - "@emotion/use-insertion-effect-with-fallbacks": ^1.0.0 - "@storybook/client-logger": 7.5.3 - "@storybook/global": ^5.0.0 - memoizerific: ^1.11.3 +"@storybook/theming@npm:8.6.18": + version: 8.6.18 + resolution: "@storybook/theming@npm:8.6.18" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: e9769d0ad9144d47755d89fad0788ca6fa990116e2c8a3ab7c491357d71adea9feb248d1a5d6a81f4981720feaf80f42373a9ed4adb85906babc14422824fae9 - languageName: node - linkType: hard - -"@storybook/types@npm:7.5.3, @storybook/types@npm:^7.0.12": - version: 7.5.3 - resolution: "@storybook/types@npm:7.5.3" - dependencies: - "@storybook/channels": 7.5.3 - "@types/babel__core": ^7.0.0 - "@types/express": ^4.7.0 - file-system-cache: 2.3.0 - checksum: f9c14fc4579260fdc014e9f759c89b2214c90b9c75a31f7bf6e11d404d47d5d350650258febf8c13467615aeabab8ac4008af8cec5fc90959639bed68ce78408 + storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 + checksum: e6f02c449a11ba7eea7ada81b17b4442c557f0fac0238f34706ca95ff1a1852014c5c56be07c5e6f43ee75ab4e8a3071e8372901b17674c4a82bfe9f48b425e1 languageName: node linkType: hard @@ -9170,7 +8363,7 @@ __metadata: languageName: node linkType: hard -"@swc/core@npm:^1.3.36, @swc/core@npm:^1.3.82": +"@swc/core@npm:^1.3.36": version: 1.3.99 resolution: "@swc/core@npm:1.3.99" dependencies: @@ -9236,25 +8429,25 @@ __metadata: languageName: node linkType: hard -"@testing-library/dom@npm:^8.0.0": - version: 8.20.1 - resolution: "@testing-library/dom@npm:8.20.1" +"@testing-library/dom@npm:10.4.0": + version: 10.4.0 + resolution: "@testing-library/dom@npm:10.4.0" dependencies: "@babel/code-frame": ^7.10.4 "@babel/runtime": ^7.12.5 "@types/aria-query": ^5.0.1 - aria-query: 5.1.3 + aria-query: 5.3.0 chalk: ^4.1.0 dom-accessibility-api: ^0.5.9 lz-string: ^1.5.0 pretty-format: ^27.0.2 - checksum: 06fc8dc67849aadb726cbbad0e7546afdf8923bd39acb64c576d706249bd7d0d05f08e08a31913fb621162e3b9c2bd0dce15964437f030f9fa4476326fdd3007 + checksum: bb128b90be0c8cd78c5f5e67aa45f53de614cc048a2b50b230e736ec710805ac6c73375af354b83c74d710b3928d52b83a273a4cb89de4eb3efe49e91e706837 languageName: node linkType: hard -"@testing-library/dom@npm:^9.0.0": - version: 9.3.3 - resolution: "@testing-library/dom@npm:9.3.3" +"@testing-library/dom@npm:^8.0.0": + version: 8.20.1 + resolution: "@testing-library/dom@npm:8.20.1" dependencies: "@babel/code-frame": ^7.10.4 "@babel/runtime": ^7.12.5 @@ -9264,7 +8457,22 @@ __metadata: dom-accessibility-api: ^0.5.9 lz-string: ^1.5.0 pretty-format: ^27.0.2 - checksum: 34e0a564da7beb92aa9cc44a9080221e2412b1a132eb37be3d513fe6c58027674868deb9f86195756d98d15ba969a30fe00632a4e26e25df2a5a4f6ac0686e37 + checksum: 06fc8dc67849aadb726cbbad0e7546afdf8923bd39acb64c576d706249bd7d0d05f08e08a31913fb621162e3b9c2bd0dce15964437f030f9fa4476326fdd3007 + languageName: node + linkType: hard + +"@testing-library/jest-dom@npm:6.5.0": + version: 6.5.0 + resolution: "@testing-library/jest-dom@npm:6.5.0" + dependencies: + "@adobe/css-tools": ^4.4.0 + aria-query: ^5.0.0 + chalk: ^3.0.0 + css.escape: ^1.5.1 + dom-accessibility-api: ^0.6.3 + lodash: ^4.17.21 + redent: ^3.0.0 + checksum: c2d14103ebe3358852ec527ff7512f64207a39932b2f7b6dff7e73ba91296b01a71bad9a9584b6ee010681380a906c1740af50470adc6db660e1c7585d012ebf languageName: node linkType: hard @@ -9282,12 +8490,12 @@ __metadata: languageName: node linkType: hard -"@testing-library/user-event@npm:^14.4.0": - version: 14.5.1 - resolution: "@testing-library/user-event@npm:14.5.1" +"@testing-library/user-event@npm:14.5.2": + version: 14.5.2 + resolution: "@testing-library/user-event@npm:14.5.2" peerDependencies: "@testing-library/dom": ">=7.21.4" - checksum: 3e6bc9fd53dfe2f3648190193ed2fd4bca2a1bfb47f68810df3b33f05412526e5fd5c4ef9dc5375635e0f4cdf1859916867b597eed22bda1321e04242ea6c519 + checksum: d76937dffcf0082fbf3bb89eb2b81a31bf5448048dd61c33928c5f10e33a58e035321d39145cefd469bb5a499c68a5b4086b22f1a44e3e7c7e817dc5f6782867 languageName: node linkType: hard @@ -9336,7 +8544,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.18.0, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -9377,66 +8585,19 @@ __metadata: languageName: node linkType: hard -"@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" - dependencies: - "@types/connect": "*" - "@types/node": "*" - checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 - languageName: node - linkType: hard - -"@types/connect@npm:*": - version: 3.4.38 - resolution: "@types/connect@npm:3.4.38" - dependencies: - "@types/node": "*" - checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 - languageName: node - linkType: hard - -"@types/cross-spawn@npm:^6.0.2": - version: 6.0.6 - resolution: "@types/cross-spawn@npm:6.0.6" +"@types/babel__traverse@npm:^7.18.0": + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@types/node": "*" - checksum: b4172927cd1387cf037c3ade785ef46c87537b7bc2803d7f6663b4904d0c5d6f726415d1adb2fee4fecb21746738f11336076449265d46be4ce110cc3a8c8436 - languageName: node - linkType: hard - -"@types/detect-port@npm:^1.3.0": - version: 1.3.5 - resolution: "@types/detect-port@npm:1.3.5" - checksum: 923cf04c6a05af59090743baeb9948f1938ceb98c1f7ea93db7ac310210426b385aa00005d23039ebb8019a9d13e141f5246e9c733b290885018d722a4787921 - languageName: node - linkType: hard - -"@types/doctrine@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/doctrine@npm:0.0.3" - checksum: 7ca9c8ff4d2da437785151c9eef0dd80b8fa12e0ff0fcb988458a78de4b6f0fc92727ba5bbee446e1df615a91f03053c5783b30b7c21ab6ceab6a42557e93e50 + "@babel/types": ^7.28.2 + checksum: e3124e6575b2f70de338eab8a9c704d315a86c46a8e395b6ec78a0157ab7b5fd877289556a57dcf28e4ff3543714e359cc1182d4afc4bcb4f3575a0bbafa0dad languageName: node linkType: hard -"@types/ejs@npm:^3.1.1": - version: 3.1.5 - resolution: "@types/ejs@npm:3.1.5" - checksum: e142266283051f27a7f79329871b311687dede19ae20268d882e4de218c65e1311d28a300b85579ca67157a8d601b7234daa50c2f99b252b121d27b4e5b21468 - languageName: node - linkType: hard - -"@types/emscripten@npm:^1.39.6": - version: 1.39.10 - resolution: "@types/emscripten@npm:1.39.10" - checksum: 1721da76593f9194e0b7c90a581e2d31c23bd4eb28f93030cd1dc58216cdf1e692c045274f2eedaed29c652c25c9a4dff2e503b11bd1258d07095c009a1956b1 - languageName: node - linkType: hard - -"@types/escodegen@npm:^0.0.6": - version: 0.0.6 - resolution: "@types/escodegen@npm:0.0.6" - checksum: 7b25aeedd48dbef68345224082c6bc774845cbfc1d9b2ce91a477130fe7ccabf33da126c1d6d55e5dfd838db429a7c80890628a167e5aa55b6a4620974da38d3 +"@types/doctrine@npm:^0.0.9": + version: 0.0.9 + resolution: "@types/doctrine@npm:0.0.9" + checksum: 3909eaca42e7386b2ab866f082b78da3e00718d2fa323597e254feb0556c678b41f2c490729067433630083ac9c806ec6ae1e146754f7f8ba7d3e43ed68d6500 languageName: node linkType: hard @@ -9474,45 +8635,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^0.0.51": - version: 0.0.51 - resolution: "@types/estree@npm:0.0.51" - checksum: e56a3bcf759fd9185e992e7fdb3c6a5f81e8ff120e871641607581fb3728d16c811702a7d40fa5f869b7f7b4437ab6a87eb8d98ffafeee51e85bbe955932a189 - languageName: node - linkType: hard - -"@types/express-serve-static-core@npm:^4.17.33": - version: 4.17.41 - resolution: "@types/express-serve-static-core@npm:4.17.41" - dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - "@types/send": "*" - checksum: 12750f6511dd870bbaccfb8208ad1e79361cf197b147f62a3bedc19ec642f3a0f9926ace96705f4bc88ec2ae56f61f7ca8c2438e6b22f5540842b5569c28a121 - languageName: node - linkType: hard - -"@types/express@npm:^4.7.0": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.33 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5 - languageName: node - linkType: hard - -"@types/find-cache-dir@npm:^3.2.1": - version: 3.2.1 - resolution: "@types/find-cache-dir@npm:3.2.1" - checksum: bf5c4e96da40247cd9e6327f54dfccda961a0fb2d70e3c71bd05def94de4c2e6fb310fe8ecb0f04ecf5dbc52214e184b55a2337b0f87250d4ae1e2e7d58321e4 - languageName: node - linkType: hard - -"@types/graceful-fs@npm:^4.1.2, @types/graceful-fs@npm:^4.1.3": +"@types/graceful-fs@npm:^4.1.2": version: 4.1.9 resolution: "@types/graceful-fs@npm:4.1.9" dependencies: @@ -9544,13 +8667,6 @@ __metadata: languageName: node linkType: hard -"@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 - languageName: node - linkType: hard - "@types/is-ci@npm:^3.0.0": version: 3.0.4 resolution: "@types/is-ci@npm:3.0.4" @@ -9606,13 +8722,6 @@ __metadata: languageName: node linkType: hard -"@types/lodash@npm:^4.14.167": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: a91acf3564a568c6f199912f3eb2c76c99c5a0d7e219394294213b3f2d54f672619f0fde4da22b29dc5d4c31457cd799acc2e5cb6bd90f9af04a1578483b6ff7 - languageName: node - linkType: hard - "@types/mdx@npm:^2.0.0": version: 2.0.10 resolution: "@types/mdx@npm:2.0.10" @@ -9620,27 +8729,6 @@ __metadata: languageName: node linkType: hard -"@types/mime-types@npm:^2.1.0": - version: 2.1.4 - resolution: "@types/mime-types@npm:2.1.4" - checksum: f8c521c54ee0c0b9f90a65356a80b1413ed27ccdc94f5c7ebb3de5d63cedb559cd2610ea55b4100805c7349606a920d96e54f2d16b2f0afa6b7cd5253967ccc9 - languageName: node - linkType: hard - -"@types/mime@npm:*": - version: 3.0.4 - resolution: "@types/mime@npm:3.0.4" - checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843 - languageName: node - linkType: hard - -"@types/mime@npm:^1": - version: 1.3.5 - resolution: "@types/mime@npm:1.3.5" - checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 - languageName: node - linkType: hard - "@types/minimatch@npm:^3.0.3": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" @@ -9655,16 +8743,6 @@ __metadata: languageName: node linkType: hard -"@types/node-fetch@npm:^2.6.4": - version: 2.6.9 - resolution: "@types/node-fetch@npm:2.6.9" - dependencies: - "@types/node": "*" - form-data: ^4.0.0 - checksum: 212269aff4b251477c13c33cee6cea23e4fd630be6c0bfa3714968cce7efd7055b52f2f82aab3394596d8c758335cc802e7c5fa3f775e7f2a472fa914c90dc15 - languageName: node - linkType: hard - "@types/node@npm:*": version: 20.9.3 resolution: "@types/node@npm:20.9.3" @@ -9695,15 +8773,6 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^18.0.0": - version: 18.18.11 - resolution: "@types/node@npm:18.18.11" - dependencies: - undici-types: ~5.26.4 - checksum: e4c2c5b792023c86248013589820d157ced46a35dcd60b15a3133a8f67f6b54c8870f245ecccbe7a12c49f1991ea84401946ddbb3f44894ec042642233e616d5 - languageName: node - linkType: hard - "@types/node@npm:^20.11.19": version: 20.11.19 resolution: "@types/node@npm:20.11.19" @@ -9764,20 +8833,13 @@ __metadata: languageName: node linkType: hard -"@types/qs@npm:*, @types/qs@npm:^6.9.5": +"@types/qs@npm:^6.9.5": version: 6.9.10 resolution: "@types/qs@npm:6.9.10" checksum: 3e479ee056bd2b60894baa119d12ecd33f20a25231b836af04654e784c886f28a356477630430152a86fba253da65d7ecd18acffbc2a8877a336e75aa0272c67 languageName: node linkType: hard -"@types/range-parser@npm:*": - version: 1.2.7 - resolution: "@types/range-parser@npm:1.2.7" - checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a - languageName: node - linkType: hard - "@types/react-dom@npm:<18.0.0": version: 17.0.24 resolution: "@types/react-dom@npm:17.0.24" @@ -9787,34 +8849,12 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.2.19": - version: 18.2.19 - resolution: "@types/react-dom@npm:18.2.19" - dependencies: - "@types/react": "*" - checksum: 087a19d8e4c1c0900ec4ac5ddb749a811a38274b25683d233c11755d2895cc6e475e8bf9bea3dee36519769298e078d4c2feab9ab4bd13b26bc2a6170716437e - languageName: node - linkType: hard - -"@types/react@npm:*, @types/react@npm:^18.2.55": - version: 18.2.56 - resolution: "@types/react@npm:18.2.56" - dependencies: - "@types/prop-types": "*" - "@types/scheduler": "*" - csstype: ^3.0.2 - checksum: 8f6d754e4add007667002bd3f4c3a3a577c4a75afcd5cdc93bd3c584750f25c41a024a9f7de802204156483bc2fcce417ff9d7063ac1713e2b8ccb7c8a08c0ff - languageName: node - linkType: hard - -"@types/react@npm:>=16": - version: 18.2.38 - resolution: "@types/react@npm:18.2.38" - dependencies: - "@types/prop-types": "*" - "@types/scheduler": "*" - csstype: ^3.0.2 - checksum: 71f8c167173d32252be8b2d3c1c76b3570b94d2fbbd139da86d146be453626f5777e12c2781559119637520dbef9f91cffe968f67b5901618f29226d49fad326 +"@types/react-dom@npm:^19.0.0": + version: 19.2.3 + resolution: "@types/react-dom@npm:19.2.3" + peerDependencies: + "@types/react": ^19.2.0 + checksum: b9c548f7378979cd8384444ae6c96f7a933b98e341c271c33e74231f27bf3082f04ad7c2927f1b1e6d8af35ccf83e549fce4978ebe0a02ded5a8803aa5f80e06 languageName: node linkType: hard @@ -9829,6 +8869,15 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:^19.0.0": + version: 19.2.14 + resolution: "@types/react@npm:19.2.14" + dependencies: + csstype: ^3.2.2 + checksum: ddd330292abf2dc2cfa65188e1c5f67cc6e90f8d8ffb088f753a38db9d123f942c23d324a6b7e8027ff04f22b395492150f54b9b520b6cbec1e8841e669f2c19 + languageName: node + linkType: hard + "@types/resolve@npm:1.17.1": version: 1.17.1 resolution: "@types/resolve@npm:1.17.1" @@ -9845,6 +8894,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:^1.20.2": + version: 1.20.6 + resolution: "@types/resolve@npm:1.20.6" + checksum: dc35f5517606b6687cd971c0281ac58bdee2c50c051b030f04647d3991688be2259c304ee97e5b5d4b9936072c36767eb5933b54611a407d6557972bb6fea4f6 + languageName: node + linkType: hard + "@types/scheduler@npm:*": version: 0.16.7 resolution: "@types/scheduler@npm:0.16.7" @@ -9859,27 +8915,6 @@ __metadata: languageName: node linkType: hard -"@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" - dependencies: - "@types/mime": ^1 - "@types/node": "*" - checksum: cf4db48251bbb03cd6452b4de6e8e09e2d75390a92fd798eca4a803df06444adc94ed050246c94c7ed46fb97be1f63607f0e1f13c3ce83d71788b3e08640e5e0 - languageName: node - linkType: hard - -"@types/serve-static@npm:*": - version: 1.15.5 - resolution: "@types/serve-static@npm:1.15.5" - dependencies: - "@types/http-errors": "*" - "@types/mime": "*" - "@types/node": "*" - checksum: 0ff4b3703cf20ba89c9f9e345bc38417860a88e85863c8d6fe274a543220ab7f5f647d307c60a71bb57dc9559f0890a661e8dc771a6ec5ef195d91c8afc4a893 - languageName: node - linkType: hard - "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -9894,13 +8929,20 @@ __metadata: languageName: node linkType: hard -"@types/unist@npm:^2, @types/unist@npm:^2.0.0": +"@types/unist@npm:^2": version: 2.0.10 resolution: "@types/unist@npm:2.0.10" checksum: e2924e18dedf45f68a5c6ccd6015cd62f1643b1b43baac1854efa21ae9e70505db94290434a23da1137d9e31eb58e54ca175982005698ac37300a1c889f6c4aa languageName: node linkType: hard +"@types/uuid@npm:^9.0.1": + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 + languageName: node + linkType: hard + "@types/webpack-env@npm:^1.16.0": version: 1.18.4 resolution: "@types/webpack-env@npm:1.18.4" @@ -10199,6 +9241,68 @@ __metadata: languageName: node linkType: hard +"@vitest/expect@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/expect@npm:2.0.5" + dependencies: + "@vitest/spy": 2.0.5 + "@vitest/utils": 2.0.5 + chai: ^5.1.1 + tinyrainbow: ^1.2.0 + checksum: 0c65eb24c2fd9ef5735d1e65dc8fee59936e6cab1d6ab24a95e014b8337be5598242fceae4e8ec2974e2ae70a30c1906ad41208bf6de6cdf2043594cdb65e627 + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/pretty-format@npm:2.0.5" + dependencies: + tinyrainbow: ^1.2.0 + checksum: d60346001180e5bb3c53be4b4d0b6d9352648b066641d5aba7b97d7c97a8e252dc934204d58818330262a65f07127455fc5f3b5f7e3647c60f6ff302a725733b + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.9": + version: 2.1.9 + resolution: "@vitest/pretty-format@npm:2.1.9" + dependencies: + tinyrainbow: ^1.2.0 + checksum: 33f7ff0a9d356ddd6534390a0aea260dc04a3022a94901c87d141bacf71d2b3fff2e3bf08a55dd424c5355fd3b41656cb7871c76372fef45ffac1ea89d0dc508 + languageName: node + linkType: hard + +"@vitest/spy@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/spy@npm:2.0.5" + dependencies: + tinyspy: ^3.0.0 + checksum: a010dec99146832a2586c639fccf533b194482f6f25ffb2d64367598a4e77d094aedd3d82cdb55fc1a3971649577a039513ccf8dc1571492e5982482c530c7b9 + languageName: node + linkType: hard + +"@vitest/utils@npm:2.0.5": + version: 2.0.5 + resolution: "@vitest/utils@npm:2.0.5" + dependencies: + "@vitest/pretty-format": 2.0.5 + estree-walker: ^3.0.3 + loupe: ^3.1.1 + tinyrainbow: ^1.2.0 + checksum: 6867556dd7e376437e454b96c7e596ec16e141fb00b002b6ce435611ab3d9d1e3f38ebf48b1fc49f4c97f9754ed37abb602de8bf122f4ac0de621a4dbe0a314e + languageName: node + linkType: hard + +"@vitest/utils@npm:^2.1.1": + version: 2.1.9 + resolution: "@vitest/utils@npm:2.1.9" + dependencies: + "@vitest/pretty-format": 2.1.9 + loupe: ^3.1.2 + tinyrainbow: ^1.2.0 + checksum: b24fb9c6765801f2e0578ad5c32fadf9541a833301eaed2877a427096cf05214244b361f94eda80be2b9c841f58ae3c67d37dedc5a902b2cb44041979bae4d8f + languageName: node + linkType: hard + "@web/parse5-utils@npm:^2.1.0": version: 2.1.0 resolution: "@web/parse5-utils@npm:2.1.0" @@ -10651,37 +9755,6 @@ __metadata: languageName: node linkType: hard -"@yarnpkg/esbuild-plugin-pnp@npm:^3.0.0-rc.10": - version: 3.0.0-rc.15 - resolution: "@yarnpkg/esbuild-plugin-pnp@npm:3.0.0-rc.15" - dependencies: - tslib: ^2.4.0 - peerDependencies: - esbuild: ">=0.10.0" - checksum: 04da15355a99773b441742814ba4d0f3453a83df47aa07e215f167e156f109ab8e971489c8b1a4ddf3c79d568d35213f496ad52e97298228597e1aacc22680aa - languageName: node - linkType: hard - -"@yarnpkg/fslib@npm:2.10.3": - version: 2.10.3 - resolution: "@yarnpkg/fslib@npm:2.10.3" - dependencies: - "@yarnpkg/libzip": ^2.3.0 - tslib: ^1.13.0 - checksum: 0ca693f61d47bcf165411a121ed9123f512b1b5bfa5e1c6c8f280b4ffdbea9bf2a6db418f99ecfc9624587fdc695b2b64eb0fe7b4028e44095914b25ca99655e - languageName: node - linkType: hard - -"@yarnpkg/libzip@npm:2.3.0, @yarnpkg/libzip@npm:^2.3.0": - version: 2.3.0 - resolution: "@yarnpkg/libzip@npm:2.3.0" - dependencies: - "@types/emscripten": ^1.39.6 - tslib: ^1.13.0 - checksum: 533a4883f69bb013f955d80dc19719881697e6849ea5f0cbe6d87ef1d582b05cbae8a453802f92ad0c852f976296cac3ff7834be79a7e415b65cdf213e448110 - languageName: node - linkType: hard - "@yarnpkg/lockfile@npm:^1.1.0": version: 1.1.0 resolution: "@yarnpkg/lockfile@npm:1.1.0" @@ -10795,7 +9868,7 @@ __metadata: languageName: node linkType: hard -"acorn-jsx@npm:^5.3.1, acorn-jsx@npm:^5.3.2": +"acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" peerDependencies: @@ -10804,17 +9877,19 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^7.1.1, acorn-walk@npm:^7.2.0": +"acorn-walk@npm:^7.1.1": version: 7.2.0 resolution: "acorn-walk@npm:7.2.0" checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f languageName: node linkType: hard -"acorn-walk@npm:^8.2.0": - version: 8.3.0 - resolution: "acorn-walk@npm:8.3.0" - checksum: 15ea56ab6529135be05e7d018f935ca80a572355dd3f6d3cd717e36df3346e0f635a93ae781b1c7942607693e2e5f3ef81af5c6fc697bbadcc377ebda7b7f5f6 +"acorn-walk@npm:^8.3.4": + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" + dependencies: + acorn: ^8.11.0 + checksum: ea8b55206c8913ce1d71a62dc10215ad919e3caf64053de72038e0be25dd8ef1454ffdcb6f25ed3b5325204f7ae18131e7fbbdfd7554f9538985a570188c60a8 languageName: node linkType: hard @@ -10827,7 +9902,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^7.1.1, acorn@npm:^7.4.1": +"acorn@npm:^7.1.1": version: 7.4.1 resolution: "acorn@npm:7.4.1" bin: @@ -10836,7 +9911,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.2, acorn@npm:^8.2.4, acorn@npm:^8.5.0, acorn@npm:^8.7.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.11.0, acorn@npm:^8.15.0": + version: 8.16.0 + resolution: "acorn@npm:8.16.0" + bin: + acorn: bin/acorn + checksum: bbfa466cd0dbd18b4460a85e9d0fc2f35db999380892403c573261beda91f23836db2aa71fd3ae65e94424ad14ff8e2b7bd37c7a2624278fd89137cd6e448c41 + languageName: node + linkType: hard + +"acorn@npm:^8.11.2, acorn@npm:^8.2.4, acorn@npm:^8.5.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -10852,23 +9936,6 @@ __metadata: languageName: node linkType: hard -"address@npm:^1.0.1": - version: 1.2.2 - resolution: "address@npm:1.2.2" - checksum: ace439960c1e3564d8f523aff23a841904bf33a2a7c2e064f7f60a064194075758b9690e65bd9785692a4ef698a998c57eb74d145881a1cecab8ba658ddb1607 - languageName: node - linkType: hard - -"adjust-sourcemap-loader@npm:^4.0.0": - version: 4.0.0 - resolution: "adjust-sourcemap-loader@npm:4.0.0" - dependencies: - loader-utils: ^2.0.0 - regex-parser: ^2.2.11 - checksum: d524ae23582f41e2275af5d88faab7a9dc09770ed588244e0a76d3196d0d6a90bf02760c71bc6213dbfef3aef4a86232ac9521bfd629752c32b7af37bc74c660 - languageName: node - linkType: hard - "adm-zip@npm:^0.5.9": version: 0.5.10 resolution: "adm-zip@npm:0.5.10" @@ -10876,13 +9943,6 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:5": - version: 5.1.1 - resolution: "agent-base@npm:5.1.1" - checksum: 61ae789f3019f1dc10e8cba6d3ae9826949299a4e54aaa1cfa2fa37c95a108e70e95423b963bb987d7891a703fd9a5c383a506f4901819f3ee56f3147c0aa8ab - languageName: node - linkType: hard - "agent-base@npm:6, agent-base@npm:^6.0.2": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -10968,6 +10028,20 @@ __metadata: languageName: node linkType: hard +"ajv-formats@npm:^3.0.1": + version: 3.0.1 + resolution: "ajv-formats@npm:3.0.1" + dependencies: + ajv: ^8.0.0 + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: f4e1fe232d67fcafc02eafe373a7a9962351e0439dd0736647ca75c93c3da23b430b6502c255ab4315410ae330d4f3013ac9fe226c40b2524ca93a58e786d086 + languageName: node + linkType: hard + "ajv-keywords@npm:^3.1.0, ajv-keywords@npm:^3.4.1, ajv-keywords@npm:^3.5.2": version: 3.5.2 resolution: "ajv-keywords@npm:3.5.2" @@ -11012,6 +10086,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.17.1": + version: 8.20.0 + resolution: "ajv@npm:8.20.0" + dependencies: + fast-deep-equal: ^3.1.3 + fast-uri: ^3.0.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + checksum: 4f18ca5fcccff8c8b9a4d6f1a6a3a70ffc888e787624ca66f2d0162e04e8f9f2d289d8a1acdb9520d18bffcee975e7a789a9f8292b5c2c577c408cd2c3308cad + languageName: node + linkType: hard + "anser@npm:^1.4.9": version: 1.4.10 resolution: "anser@npm:1.4.10" @@ -11053,7 +10139,7 @@ __metadata: languageName: node linkType: hard -"ansi-html-community@npm:0.0.8, ansi-html-community@npm:^0.0.8": +"ansi-html-community@npm:0.0.8": version: 0.0.8 resolution: "ansi-html-community@npm:0.0.8" bin: @@ -11270,20 +10356,11 @@ __metadata: checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 languageName: node linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"aria-hidden@npm:^1.1.1": - version: 1.2.3 - resolution: "aria-hidden@npm:1.2.3" - dependencies: - tslib: ^2.0.0 - checksum: 7d7d211629eef315e94ed3b064c6823d13617e609d3f9afab1c2ed86399bb8e90405f9bdd358a85506802766f3ecb468af985c67c846045a34b973bcc0289db9 + +"argparse@npm:^2.0.1": + version: 2.0.1 + resolution: "argparse@npm:2.0.1" + checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced languageName: node linkType: hard @@ -11296,7 +10373,7 @@ __metadata: languageName: node linkType: hard -"aria-query@npm:^5.3.0": +"aria-query@npm:5.3.0, aria-query@npm:^5.3.0": version: 5.3.0 resolution: "aria-query@npm:5.3.0" dependencies: @@ -11305,6 +10382,13 @@ __metadata: languageName: node linkType: hard +"aria-query@npm:^5.0.0": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: d971175c85c10df0f6d14adfe6f1292409196114ab3c62f238e208b53103686f46cc70695a4f775b73bc65f6a09b6a092fd963c4f3a5a7d690c8fc5094925717 + languageName: node + linkType: hard + "arr-diff@npm:^4.0.0": version: 4.0.0 resolution: "arr-diff@npm:4.0.0" @@ -11394,6 +10478,13 @@ __metadata: languageName: node linkType: hard +"array-timsort@npm:^1.0.3": + version: 1.0.3 + resolution: "array-timsort@npm:1.0.3" + checksum: fd4b5b0911214bdc8b5699ed10d309685551b518b3819c611c967cff59b87aee01cf591a10e36a3f14dbff696984bd6682b845f6fdbf1217195e910f241a4f78 + languageName: node + linkType: hard + "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -11597,16 +10688,10 @@ __metadata: languageName: node linkType: hard -"assert@npm:^2.0.0": - version: 2.1.0 - resolution: "assert@npm:2.1.0" - dependencies: - call-bind: ^1.0.2 - is-nan: ^1.3.2 - object-is: ^1.1.5 - object.assign: ^4.1.4 - util: ^0.12.5 - checksum: 1ed1cabba9abe55f4109b3f7292b4e4f3cf2953aad8dc148c0b3c3bd676675c31b1abb32ef563b7d5a19d1715bf90d1e5f09fad2a4ee655199468902da80f7c2 +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 languageName: node linkType: hard @@ -11633,15 +10718,6 @@ __metadata: languageName: node linkType: hard -"ast-types@npm:^0.14.2": - version: 0.14.2 - resolution: "ast-types@npm:0.14.2" - dependencies: - tslib: ^2.0.1 - checksum: 8674a77307764979f0a0b2006b7223a4b789abffaa7acbf6a1132650a799252155170173a1ff6a7fb6897f59437fc955f2707bdfc391b0797750898876e6c9ed - languageName: node - linkType: hard - "ast-types@npm:^0.16.1": version: 0.16.1 resolution: "ast-types@npm:0.16.1" @@ -11812,23 +10888,16 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:^9.0.0": - version: 9.1.3 - resolution: "babel-loader@npm:9.1.3" +"babel-loader@npm:^9.2.1": + version: 9.2.1 + resolution: "babel-loader@npm:9.2.1" dependencies: find-cache-dir: ^4.0.0 schema-utils: ^4.0.0 peerDependencies: "@babel/core": ^7.12.0 webpack: ">=5" - checksum: b168dde5b8cf11206513371a79f86bb3faa7c714e6ec9fffd420876b61f3d7f5f4b976431095ef6a14bc4d324505126deb91045fd41e312ba49f4deaa166fe28 - languageName: node - linkType: hard - -"babel-plugin-add-react-displayname@npm:^0.0.5": - version: 0.0.5 - resolution: "babel-plugin-add-react-displayname@npm:0.0.5" - checksum: a5b52aa14327b1fa2949f32140cd1b0b283b2035881453d71dcedc825a7378aa3a578bff5f76d1632875eedb40612dc4e71585852ce5cb3c2869c180643fd001 + checksum: e1858d7625ad7cc8cabe6bbb8657f957041ffb1308375f359e92aa1654f413bfbb86a281bbf7cd4f7fff374d571c637b117551deac0231d779a198d4e4e78331 languageName: node linkType: hard @@ -11881,13 +10950,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-named-exports-order@npm:^0.0.2": - version: 0.0.2 - resolution: "babel-plugin-named-exports-order@npm:0.0.2" - checksum: d918390a09c0148893ea93bdc9c4fc6a03447c688eaf40bed0f0682d036e985ecee830b90fec2ab149b8dc0cb3220a2c0ac5054e42626bdfe0b436b505b7ef22 - languageName: node - linkType: hard - "babel-plugin-polyfill-corejs2@npm:^0.4.6": version: 0.4.6 resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" @@ -11936,17 +10998,6 @@ __metadata: languageName: node linkType: hard -"babel-plugin-react-docgen@npm:^4.2.1": - version: 4.2.1 - resolution: "babel-plugin-react-docgen@npm:4.2.1" - dependencies: - ast-types: ^0.14.2 - lodash: ^4.17.15 - react-docgen: ^5.0.0 - checksum: 6126d358ac2cb27a9a7f145ab586b7a28cb19ef09ca37c4f08a853246a101328ffe6c87813e95b1b4ba05beb627285199f7d0ba16abfb61b35cc4febb6d5eabd - languageName: node - linkType: hard - "babel-plugin-react-native-web@npm:~0.18.10": version: 0.18.12 resolution: "babel-plugin-react-native-web@npm:0.18.12" @@ -12117,6 +11168,15 @@ __metadata: languageName: node linkType: hard +"baseline-browser-mapping@npm:^2.10.12": + version: 2.10.25 + resolution: "baseline-browser-mapping@npm:2.10.25" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 285ddc00c39704fc905cd9bb296cc01f653f37618cd1da4dfd03d098cec30f17bdfc133ac87b9d49938cefc58b30bccb7a49c15aa1da8930581fce61d07b514a + languageName: node + linkType: hard + "basic-auth@npm:~2.0.1": version: 2.0.1 resolution: "basic-auth@npm:2.0.1" @@ -12165,7 +11225,7 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:1.6.x, big-integer@npm:^1.6.44": +"big-integer@npm:1.6.x": version: 1.6.51 resolution: "big-integer@npm:1.6.51" checksum: 3d444173d1b2e20747e2c175568bedeebd8315b0637ea95d75fd27830d3b8e8ba36c6af40374f36bdaea7b5de376dcada1b07587cb2a79a928fccdb6e6e3c518 @@ -12327,15 +11387,6 @@ __metadata: languageName: node linkType: hard -"bplist-parser@npm:^0.2.0": - version: 0.2.0 - resolution: "bplist-parser@npm:0.2.0" - dependencies: - big-integer: ^1.6.44 - checksum: d5339dd16afc51de6c88f88f58a45b72ed6a06aa31f5557d09877575f220b7c1d3fbe375da0b62e6a10d4b8ed80523567e351f24014f5bc886ad523758142cdd - languageName: node - linkType: hard - "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -12476,15 +11527,6 @@ __metadata: languageName: node linkType: hard -"browserify-zlib@npm:^0.1.4": - version: 0.1.4 - resolution: "browserify-zlib@npm:0.1.4" - dependencies: - pako: ~0.2.0 - checksum: abee4cb4349e8a21391fd874564f41b113fe691372913980e6fa06a777e4ea2aad4e942af14ab99bce190d5ac8f5328201432f4ef0eae48c6d02208bc212976f - languageName: node - linkType: hard - "browserify-zlib@npm:^0.2.0": version: 0.2.0 resolution: "browserify-zlib@npm:0.2.0" @@ -12522,6 +11564,21 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.24.0": + version: 4.28.2 + resolution: "browserslist@npm:4.28.2" + dependencies: + baseline-browser-mapping: ^2.10.12 + caniuse-lite: ^1.0.30001782 + electron-to-chromium: ^1.5.328 + node-releases: ^2.0.36 + update-browserslist-db: ^1.2.3 + bin: + browserslist: cli.js + checksum: 702cdd3462b5eb6f8a9bb3bf7bdc6d6a4141ced6935bb44edb7f3d40edd66198775f2b4a9178682535391293e04e625ba2b5943546d692f42ea080323cecb25e + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -12548,13 +11605,6 @@ __metadata: languageName: node linkType: hard -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c - languageName: node - linkType: hard - "buffer-fill@npm:^1.0.0": version: 1.0.0 resolution: "buffer-fill@npm:1.0.0" @@ -12665,28 +11715,6 @@ __metadata: languageName: node linkType: hard -"c8@npm:^7.6.0": - version: 7.14.0 - resolution: "c8@npm:7.14.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@istanbuljs/schema": ^0.1.3 - find-up: ^5.0.0 - foreground-child: ^2.0.0 - istanbul-lib-coverage: ^3.2.0 - istanbul-lib-report: ^3.0.0 - istanbul-reports: ^3.1.4 - rimraf: ^3.0.2 - test-exclude: ^6.0.0 - v8-to-istanbul: ^9.0.0 - yargs: ^16.2.0 - yargs-parser: ^20.2.9 - bin: - c8: bin/c8.js - checksum: ca44bbd200b09dd5b7a3b8909b964c82eabbbb28ce4543873a313118e1ba24c924fdb6440ed09c636debdbd2dffec5529cca9657d408cba295367b715e131975 - languageName: node - linkType: hard - "cacache@npm:^12.0.2": version: 12.0.4 resolution: "cacache@npm:12.0.4" @@ -12943,6 +11971,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001782": + version: 1.0.30001791 + resolution: "caniuse-lite@npm:1.0.30001791" + checksum: 9b2f55d51b85abbb270a0d58c28b8e799ccb8fd5ef017179db3d328c8fead4f1738d95a354e75169af31c0424ffb1b691533722522ff280d4aab05d0fe4eddbd + languageName: node + linkType: hard + "case-sensitive-paths-webpack-plugin@npm:^2.4.0": version: 2.4.0 resolution: "case-sensitive-paths-webpack-plugin@npm:2.4.0" @@ -12950,6 +11985,19 @@ __metadata: languageName: node linkType: hard +"chai@npm:^5.1.1": + version: 5.3.3 + resolution: "chai@npm:5.3.3" + dependencies: + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 + checksum: bc4091f1cccfee63f6a3d02ce477fe847f5c57e747916a11bd72675c9459125084e2e55dc2363ee2b82b088a878039ee7ee27c75d6d90f7de9202bf1b12ce573 + languageName: node + linkType: hard + "chalk@npm:1.1.3, chalk@npm:^1.0.0, chalk@npm:^1.1.3": version: 1.1.3 resolution: "chalk@npm:1.1.3" @@ -12984,6 +12032,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^3.0.0": + version: 3.0.0 + resolution: "chalk@npm:3.0.0" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: 8e3ddf3981c4da405ddbd7d9c8d91944ddf6e33d6837756979f7840a29272a69a5189ecae0ff84006750d6d1e92368d413335eab4db5476db6e6703a1d1e0505 + languageName: node + linkType: hard + "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -13036,6 +12094,13 @@ __metadata: languageName: node linkType: hard +"chardet@npm:^2.1.1": + version: 2.1.1 + resolution: "chardet@npm:2.1.1" + checksum: 4e3dba2699018b79bb90a9562b5e5be27fcaab55250c12fa72f026b859fb24846396c346968546c14efc69b9f23aca3ef2b9816775012d08a4686ce3c362415c + languageName: node + linkType: hard + "charenc@npm:0.0.2, charenc@npm:~0.0.1": version: 0.0.2 resolution: "charenc@npm:0.0.2" @@ -13043,6 +12108,13 @@ __metadata: languageName: node linkType: hard +"check-error@npm:^2.1.1": + version: 2.1.3 + resolution: "check-error@npm:2.1.3" + checksum: f1868d3db60f5a7da92e140ccf33e9152bf6124161fa9b7a4ae8eafdb05e66e1f13570401e56f314f037b0f1b71eaf38ad0c7256310d82c6105e9d85ded0f202 + languageName: node + linkType: hard + "chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.1, chokidar@npm:^3.4.2, chokidar@npm:^3.4.3, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" @@ -13137,6 +12209,13 @@ __metadata: languageName: node linkType: hard +"cjs-module-lexer@npm:^1.2.3": + version: 1.4.3 + resolution: "cjs-module-lexer@npm:1.4.3" + checksum: 221a1661a9ff4944b472c85ac7cd5029b2f2dc7f6c5f4ecf887f261503611110b43a48acb6c07f8f04109c772d1637fdb20b31252bf27058f35aa97bf5ad8b12 + languageName: node + linkType: hard + "class-utils@npm:^0.3.5": version: 0.3.6 resolution: "class-utils@npm:0.3.6" @@ -13206,19 +12285,6 @@ __metadata: languageName: node linkType: hard -"cli-table3@npm:^0.6.1": - version: 0.6.3 - resolution: "cli-table3@npm:0.6.3" - dependencies: - "@colors/colors": 1.5.0 - string-width: ^4.2.0 - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 09897f68467973f827c04e7eaadf13b55f8aec49ecd6647cc276386ea660059322e2dd8020a8b6b84d422dbdd619597046fa89cbbbdc95b2cea149a2df7c096c - languageName: node - linkType: hard - "cli-truncate@npm:^2.1.0": version: 2.1.0 resolution: "cli-truncate@npm:2.1.0" @@ -13426,7 +12492,7 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.10, colorette@npm:^2.0.16, colorette@npm:^2.0.20": +"colorette@npm:^2.0.10, colorette@npm:^2.0.16": version: 2.0.20 resolution: "colorette@npm:2.0.20" checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d @@ -13480,7 +12546,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.12.1, commander@npm:^2.19.0, commander@npm:^2.20.0": +"commander@npm:^2.12.1, commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e @@ -13494,13 +12560,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^6.2.1": - version: 6.2.1 - resolution: "commander@npm:6.2.1" - checksum: d7090410c0de6bc5c67d3ca41c41760d6d268f3c799e530aafb73b7437d1826bbf0d2a3edac33f8b57cc9887b4a986dce307fa5557e109be40eadb7c43b21742 - languageName: node - linkType: hard - "commander@npm:^7.0.0, commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -13529,6 +12588,16 @@ __metadata: languageName: node linkType: hard +"comment-json@npm:^4.2.3": + version: 4.6.2 + resolution: "comment-json@npm:4.6.2" + dependencies: + array-timsort: ^1.0.3 + esprima: ^4.0.1 + checksum: d235957843363c562ce6df85dd17cabe908e515ff8d7641cc90fdda624c1d3b73a85aec1bfe6a6601c3cc6ce8132aaa5dc35f99b0404d26c0a1f119fe97534ff + languageName: node + linkType: hard + "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -13597,7 +12666,7 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.1, compression@npm:^1.7.4": +"compression@npm:^1.7.1": version: 1.7.4 resolution: "compression@npm:1.7.4" dependencies: @@ -13619,7 +12688,7 @@ __metadata: languageName: node linkType: hard -"concat-stream@npm:^1.5.0, concat-stream@npm:^1.6.2": +"concat-stream@npm:^1.5.0": version: 1.6.2 resolution: "concat-stream@npm:1.6.2" dependencies: @@ -13912,13 +12981,6 @@ __metadata: languageName: node linkType: hard -"core-js-pure@npm:^3.23.3": - version: 3.33.3 - resolution: "core-js-pure@npm:3.33.3" - checksum: 369f01a8b544f413da96c606039c1b9beea57fd7252b56524fcfa4276103e3e6a0f857452ed9cc5638e9d203763e2a6f8466c6915c95b64b88b3aa976467b325 - languageName: node - linkType: hard - "core-js@npm:^2.4.0": version: 2.6.12 resolution: "core-js@npm:2.6.12" @@ -14001,7 +13063,7 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.0.0, cosmiconfig@npm:^8.2.0": +"cosmiconfig@npm:^8.0.0": version: 8.3.6 resolution: "cosmiconfig@npm:8.3.6" dependencies: @@ -14195,7 +13257,7 @@ __metadata: languageName: node linkType: hard -"css-loader@npm:^6.7.1, css-loader@npm:^6.7.3": +"css-loader@npm:^6.7.1": version: 6.8.1 resolution: "css-loader@npm:6.8.1" dependencies: @@ -14254,6 +13316,13 @@ __metadata: languageName: node linkType: hard +"css.escape@npm:^1.5.1": + version: 1.5.1 + resolution: "css.escape@npm:1.5.1" + checksum: f6d38088d870a961794a2580b2b2af1027731bb43261cfdce14f19238a88664b351cc8978abc20f06cc6bbde725699dec8deb6fe9816b139fc3f2af28719e774 + languageName: node + linkType: hard + "cssesc@npm:^3.0.0": version: 3.0.0 resolution: "cssesc@npm:3.0.0" @@ -14363,6 +13432,13 @@ __metadata: languageName: node linkType: hard +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: cb882521b3398958a1ce6ca98c011aec0bde1c77ecaf8a1dd4db3b112a189939beae3b1308243b2fe50fc27eb3edeb0f73a5a4d91d928765dc6d5ecc7bda92ee + languageName: node + linkType: hard + "csv-generate@npm:^3.4.3": version: 3.4.3 resolution: "csv-generate@npm:3.4.3" @@ -14491,7 +13567,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.3.3": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -14545,7 +13621,7 @@ __metadata: languageName: node linkType: hard -"decode-uri-component@npm:^0.2.0": +"decode-uri-component@npm:^0.2.0, decode-uri-component@npm:^0.2.2": version: 0.2.2 resolution: "decode-uri-component@npm:0.2.2" checksum: 95476a7d28f267292ce745eac3524a9079058bbb35767b76e3ee87d42e34cd0275d2eb19d9d08c3e167f97556e8a2872747f5e65cbebcac8b0c98d83e285f139 @@ -14559,6 +13635,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 + languageName: node + linkType: hard + "deep-equal@npm:^1.0.1": version: 1.1.2 resolution: "deep-equal@npm:1.1.2" @@ -14627,16 +13710,6 @@ __metadata: languageName: node linkType: hard -"default-browser-id@npm:3.0.0": - version: 3.0.0 - resolution: "default-browser-id@npm:3.0.0" - dependencies: - bplist-parser: ^0.2.0 - untildify: ^4.0.0 - checksum: 279c7ad492542e5556336b6c254a4eaf31b2c63a5433265655ae6e47301197b6cfb15c595a6fdc6463b2ff8e1a1a1ed3cba56038a60e1527ba4ab1628c6b9941 - languageName: node - linkType: hard - "default-gateway@npm:^4.2.0": version: 4.2.0 resolution: "default-gateway@npm:4.2.0" @@ -14724,13 +13797,6 @@ __metadata: languageName: node linkType: hard -"defu@npm:^6.1.2": - version: 6.1.3 - resolution: "defu@npm:6.1.3" - checksum: c857a0cf854632e8528dad36454fd1c812bff8f5f091d5a6892e75d7f6b76d8319afbbfb8c504daab84ac86e40037ff37c544d50f89ed5b5419ba1989a226777 - languageName: node - linkType: hard - "del@npm:^6.0.0": version: 6.1.1 resolution: "del@npm:6.1.1" @@ -14831,7 +13897,7 @@ __metadata: languageName: node linkType: hard -"detect-indent@npm:^6.0.0, detect-indent@npm:^6.1.0": +"detect-indent@npm:^6.0.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d @@ -14861,35 +13927,6 @@ __metadata: languageName: node linkType: hard -"detect-node-es@npm:^1.1.0": - version: 1.1.0 - resolution: "detect-node-es@npm:1.1.0" - checksum: e46307d7264644975b71c104b9f028ed1d3d34b83a15b8a22373640ce5ea630e5640b1078b8ea15f202b54641da71e4aa7597093bd4b91f113db520a26a37449 - languageName: node - linkType: hard - -"detect-package-manager@npm:^2.0.1": - version: 2.0.1 - resolution: "detect-package-manager@npm:2.0.1" - dependencies: - execa: ^5.1.1 - checksum: e72b910182d5ad479198d4235be206ac64a479257b32201bb06f3c842cc34c65ea851d46f72cc1d4bf535bcc6c4b44b5b86bb29fe1192b8c9c07b46883672f28 - languageName: node - linkType: hard - -"detect-port@npm:^1.3.0": - version: 1.5.1 - resolution: "detect-port@npm:1.5.1" - dependencies: - address: ^1.0.1 - debug: 4 - bin: - detect: bin/detect-port.js - detect-port: bin/detect-port.js - checksum: b48da9340481742547263d5d985e65d078592557863402ecf538511735e83575867e94f91fe74405ea19b61351feb99efccae7e55de9a151d5654e3417cea05b - languageName: node - linkType: hard - "diff-sequences@npm:^27.5.1": version: 27.5.1 resolution: "diff-sequences@npm:27.5.1" @@ -14949,6 +13986,13 @@ __metadata: languageName: node linkType: hard +"dom-accessibility-api@npm:^0.6.3": + version: 0.6.3 + resolution: "dom-accessibility-api@npm:0.6.3" + checksum: c325b5144bb406df23f4affecffc117dbaec9af03daad9ee6b510c5be647b14d28ef0a4ea5ca06d696d8ab40bb777e5fed98b985976fdef9d8790178fa1d573f + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -15054,13 +14098,6 @@ __metadata: languageName: node linkType: hard -"dotenv-expand@npm:^10.0.0": - version: 10.0.0 - resolution: "dotenv-expand@npm:10.0.0" - checksum: 2a38b470efe0abcb1ac8490421a55e1d764dc9440fd220942bce40965074f3fb00b585f4346020cb0f0f219966ee6b4ee5023458b3e2953fe5b3214de1b314ee - languageName: node - linkType: hard - "dotenv-expand@npm:^5.1.0": version: 5.1.0 resolution: "dotenv-expand@npm:5.1.0" @@ -15068,13 +14105,6 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.0.0": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 15d75e7279018f4bafd0ee9706593dd14455ddb71b3bcba9c52574460b7ccaf67d5cf8b2c08a5af1a9da6db36c956a04a1192b101ee102a3e0cf8817bbcf3dfd - languageName: node - linkType: hard - "dotenv@npm:^7.0.0": version: 7.0.0 resolution: "dotenv@npm:7.0.0" @@ -15096,6 +14126,13 @@ __metadata: languageName: node linkType: hard +"drange@npm:^1.0.2": + version: 1.1.1 + resolution: "drange@npm:1.1.1" + checksum: 7e6ed639f9ab4d826e79717e2b0685a7ab02ecd39dac6483305dcc43ea2a27dc78b538e10adaba35c086efab216ef1f53f22bc402abfd0d29454b1c5f48fecd1 + languageName: node + linkType: hard + "duplexer@npm:^0.1.1, duplexer@npm:~0.1.1": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -15103,7 +14140,7 @@ __metadata: languageName: node linkType: hard -"duplexify@npm:^3.4.2, duplexify@npm:^3.5.0, duplexify@npm:^3.6.0": +"duplexify@npm:^3.4.2, duplexify@npm:^3.6.0": version: 3.7.1 resolution: "duplexify@npm:3.7.1" dependencies: @@ -15129,16 +14166,16 @@ __metadata: "@embeddedchat/react": "workspace:*" "@playwright/test": ^1.41.2 "@types/node": ^20.11.19 - "@types/react": ^18.2.55 - "@types/react-dom": ^18.2.19 + "@types/react": ^19.0.0 + "@types/react-dom": ^19.0.0 "@typescript-eslint/eslint-plugin": ^6.21.0 "@typescript-eslint/parser": ^6.21.0 "@vitejs/plugin-react": ^4.2.1 eslint: ^8.56.0 eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.4.5 - react: ^18.2.0 - react-dom: ^18.2.0 + react: ^19.0.0 + react-dom: ^19.0.0 typescript: ^5.2.2 vite: ^5.1.0 languageName: unknown @@ -15158,7 +14195,7 @@ __metadata: languageName: node linkType: hard -"ejs@npm:^3.1.6, ejs@npm:^3.1.7, ejs@npm:^3.1.8": +"ejs@npm:^3.1.6, ejs@npm:^3.1.7": version: 3.1.9 resolution: "ejs@npm:3.1.9" dependencies: @@ -15183,6 +14220,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.5.328": + version: 1.5.349 + resolution: "electron-to-chromium@npm:1.5.349" + checksum: b2e5f52c63789514ab29d27f830bf7f8a4c44cd58e652e201d48531eb49528a3acaa2809e6dfda913eb0b8c314afaa53ac382b970f599d254ba62802cdcc4080 + languageName: node + linkType: hard + "elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -15207,7 +14251,9 @@ __metadata: esbuild: ^0.17.19 husky: ^9.0.11 lerna: ^6.6.2 + semver: ^7.6.0 typescript: ^5.1.3 + validator: ^13.15.15 languageName: unknown linkType: soft @@ -15366,7 +14412,7 @@ __metadata: languageName: node linkType: hard -"envinfo@npm:^7.7.2, envinfo@npm:^7.7.3, envinfo@npm:^7.7.4": +"envinfo@npm:^7.7.2, envinfo@npm:^7.7.4": version: 7.11.0 resolution: "envinfo@npm:7.11.0" bin: @@ -15620,6 +14666,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.5.0": + version: 1.7.0 + resolution: "es-module-lexer@npm:1.7.0" + checksum: 7858bb76ae387fdbf8a6fccc951bf18919768309850587553eca34698b9193fbc65fab03d3d9f69163d860321fbf66adf89d5821e7f4148c7cb7d7b997259211 + languageName: node + linkType: hard + "es-module-shims@npm:^1.4.1": version: 1.8.2 resolution: "es-module-shims@npm:1.8.2" @@ -15692,13 +14745,6 @@ __metadata: languageName: node linkType: hard -"esbuild-plugin-alias@npm:^0.2.1": - version: 0.2.1 - resolution: "esbuild-plugin-alias@npm:0.2.1" - checksum: afe2d2c8b5f09d5321cb8d9c0825e8a9f6e03c2d50df92f953a291d4620cc29eddb3da9e33b238f6d8f77738e0277bdcb831f127399449fecf78fb84c04e5da9 - languageName: node - linkType: hard - "esbuild-register@npm:^3.5.0": version: 3.5.0 resolution: "esbuild-register@npm:3.5.0" @@ -15710,33 +14756,116 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.17.19": - version: 0.17.19 - resolution: "esbuild@npm:0.17.19" - dependencies: - "@esbuild/android-arm": 0.17.19 - "@esbuild/android-arm64": 0.17.19 - "@esbuild/android-x64": 0.17.19 - "@esbuild/darwin-arm64": 0.17.19 - "@esbuild/darwin-x64": 0.17.19 - "@esbuild/freebsd-arm64": 0.17.19 - "@esbuild/freebsd-x64": 0.17.19 - "@esbuild/linux-arm": 0.17.19 - "@esbuild/linux-arm64": 0.17.19 - "@esbuild/linux-ia32": 0.17.19 - "@esbuild/linux-loong64": 0.17.19 - "@esbuild/linux-mips64el": 0.17.19 - "@esbuild/linux-ppc64": 0.17.19 - "@esbuild/linux-riscv64": 0.17.19 - "@esbuild/linux-s390x": 0.17.19 - "@esbuild/linux-x64": 0.17.19 - "@esbuild/netbsd-x64": 0.17.19 - "@esbuild/openbsd-x64": 0.17.19 - "@esbuild/sunos-x64": 0.17.19 - "@esbuild/win32-arm64": 0.17.19 - "@esbuild/win32-ia32": 0.17.19 - "@esbuild/win32-x64": 0.17.19 +"esbuild@npm:^0.17.19": + version: 0.17.19 + resolution: "esbuild@npm:0.17.19" + dependencies: + "@esbuild/android-arm": 0.17.19 + "@esbuild/android-arm64": 0.17.19 + "@esbuild/android-x64": 0.17.19 + "@esbuild/darwin-arm64": 0.17.19 + "@esbuild/darwin-x64": 0.17.19 + "@esbuild/freebsd-arm64": 0.17.19 + "@esbuild/freebsd-x64": 0.17.19 + "@esbuild/linux-arm": 0.17.19 + "@esbuild/linux-arm64": 0.17.19 + "@esbuild/linux-ia32": 0.17.19 + "@esbuild/linux-loong64": 0.17.19 + "@esbuild/linux-mips64el": 0.17.19 + "@esbuild/linux-ppc64": 0.17.19 + "@esbuild/linux-riscv64": 0.17.19 + "@esbuild/linux-s390x": 0.17.19 + "@esbuild/linux-x64": 0.17.19 + "@esbuild/netbsd-x64": 0.17.19 + "@esbuild/openbsd-x64": 0.17.19 + "@esbuild/sunos-x64": 0.17.19 + "@esbuild/win32-arm64": 0.17.19 + "@esbuild/win32-ia32": 0.17.19 + "@esbuild/win32-x64": 0.17.19 + dependenciesMeta: + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 + languageName: node + linkType: hard + +"esbuild@npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0": + version: 0.25.12 + resolution: "esbuild@npm:0.25.12" + dependencies: + "@esbuild/aix-ppc64": 0.25.12 + "@esbuild/android-arm": 0.25.12 + "@esbuild/android-arm64": 0.25.12 + "@esbuild/android-x64": 0.25.12 + "@esbuild/darwin-arm64": 0.25.12 + "@esbuild/darwin-x64": 0.25.12 + "@esbuild/freebsd-arm64": 0.25.12 + "@esbuild/freebsd-x64": 0.25.12 + "@esbuild/linux-arm": 0.25.12 + "@esbuild/linux-arm64": 0.25.12 + "@esbuild/linux-ia32": 0.25.12 + "@esbuild/linux-loong64": 0.25.12 + "@esbuild/linux-mips64el": 0.25.12 + "@esbuild/linux-ppc64": 0.25.12 + "@esbuild/linux-riscv64": 0.25.12 + "@esbuild/linux-s390x": 0.25.12 + "@esbuild/linux-x64": 0.25.12 + "@esbuild/netbsd-arm64": 0.25.12 + "@esbuild/netbsd-x64": 0.25.12 + "@esbuild/openbsd-arm64": 0.25.12 + "@esbuild/openbsd-x64": 0.25.12 + "@esbuild/openharmony-arm64": 0.25.12 + "@esbuild/sunos-x64": 0.25.12 + "@esbuild/win32-arm64": 0.25.12 + "@esbuild/win32-ia32": 0.25.12 + "@esbuild/win32-x64": 0.25.12 dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true "@esbuild/android-arm": optional: true "@esbuild/android-arm64": @@ -15769,10 +14898,16 @@ __metadata: optional: true "@esbuild/linux-x64": optional: true + "@esbuild/netbsd-arm64": + optional: true "@esbuild/netbsd-x64": optional: true + "@esbuild/openbsd-arm64": + optional: true "@esbuild/openbsd-x64": optional: true + "@esbuild/openharmony-arm64": + optional: true "@esbuild/sunos-x64": optional: true "@esbuild/win32-arm64": @@ -15783,11 +14918,11 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: ac11b1a5a6008e4e37ccffbd6c2c054746fc58d0ed4a2f9ee643bd030cfcea9a33a235087bc777def8420f2eaafb3486e76adb7bdb7241a9143b43a69a10afd8 + checksum: 3d1dc181338e2c44f4374508e9d0da3e7ae90f65d7f3f5d8076ff401a1726c5c9ecc86cfc825249349f1652e12d5ae13f02bcaa4d9487c88c7a11167f52ba353 languageName: node linkType: hard -"esbuild@npm:^0.18.0, esbuild@npm:^0.18.10": +"esbuild@npm:^0.18.10": version: 0.18.20 resolution: "esbuild@npm:0.18.20" dependencies: @@ -16028,6 +15163,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e + languageName: node + linkType: hard + "escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" @@ -16056,7 +15198,7 @@ __metadata: languageName: node linkType: hard -"escodegen@npm:^2.0.0, escodegen@npm:^2.1.0": +"escodegen@npm:^2.0.0": version: 2.1.0 resolution: "escodegen@npm:2.1.0" dependencies: @@ -16523,17 +15665,6 @@ __metadata: languageName: node linkType: hard -"estree-to-babel@npm:^3.1.0": - version: 3.2.1 - resolution: "estree-to-babel@npm:3.2.1" - dependencies: - "@babel/traverse": ^7.1.6 - "@babel/types": ^7.2.0 - c8: ^7.6.0 - checksum: a4584d0c60b80ce41abe91b11052f5d48635e811c67839942c4ebd51aa33d9f9b156ad615f71ceae2a8260b5e3054f36d73db6d0d2a3b9951483f4b6187495c8 - languageName: node - linkType: hard - "estree-walker@npm:^0.6.1": version: 0.6.1 resolution: "estree-walker@npm:0.6.1" @@ -16555,6 +15686,15 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^3.0.3": + version: 3.0.3 + resolution: "estree-walker@npm:3.0.3" + dependencies: + "@types/estree": ^1.0.0 + checksum: a65728d5727b71de172c5df323385755a16c0fdab8234dc756c3854cfee343261ddfbb72a809a5660fac8c75d960bb3e21aa898c2d7e9b19bb298482ca58a3af + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -16860,7 +16000,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.17.1, express@npm:^4.17.3": +"express@npm:^4.17.1": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -16918,13 +16058,6 @@ __metadata: languageName: node linkType: hard -"extend@npm:^3.0.0": - version: 3.0.2 - resolution: "extend@npm:3.0.2" - checksum: a50a8309ca65ea5d426382ff09f33586527882cf532931cb08ca786ea3146c0553310bda688710ff61d7668eba9f96b923fe1420cdf56a2c3eaf30fcab87b515 - languageName: node - linkType: hard - "extendable-error@npm:^0.1.5": version: 0.1.7 resolution: "extendable-error@npm:0.1.7" @@ -16970,20 +16103,6 @@ __metadata: languageName: node linkType: hard -"extract-zip@npm:^1.6.6": - version: 1.7.0 - resolution: "extract-zip@npm:1.7.0" - dependencies: - concat-stream: ^1.6.2 - debug: ^2.6.9 - mkdirp: ^0.5.4 - yauzl: ^2.10.0 - bin: - extract-zip: cli.js - checksum: 011bab660d738614555773d381a6ba4815d98c1cfcdcdf027e154ebcc9fc8c9ef637b3ea5c9b2144013100071ee41722ed041fc9aacc60f6198ef747cac0c073 - languageName: node - linkType: hard - "fast-deep-equal@npm:^2.0.1": version: 2.0.1 resolution: "fast-deep-equal@npm:2.0.1" @@ -17059,6 +16178,13 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.2 + resolution: "fast-uri@npm:3.1.2" + checksum: 73a6e1b04e6fcf7a09ed93316e72d643ef177d26969973784690708612141f2c2f74657120bab75bf5bbc26bfd535a32c90a8c3bc50aca50584cf01f98815afe + languageName: node + linkType: hard + "fast-xml-parser@npm:^4.0.12": version: 4.3.2 resolution: "fast-xml-parser@npm:4.3.2" @@ -17137,15 +16263,6 @@ __metadata: languageName: node linkType: hard -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 - languageName: node - linkType: hard - "fetch-retry@npm:^4.1.1": version: 4.1.1 resolution: "fetch-retry@npm:4.1.1" @@ -17153,13 +16270,6 @@ __metadata: languageName: node linkType: hard -"fetch-retry@npm:^5.0.2": - version: 5.0.6 - resolution: "fetch-retry@npm:5.0.6" - checksum: 4ad8bca6ec7a7b1212e636bb422a9ae8bb9dce38df0b441c9eb77a29af99b368029d6248ff69427da67e3d43c53808b121135ea395e7fe4f8f383e0ad65b4f27 - languageName: node - linkType: hard - "figgy-pudding@npm:^3.5.1": version: 3.5.2 resolution: "figgy-pudding@npm:3.5.2" @@ -17204,16 +16314,6 @@ __metadata: languageName: node linkType: hard -"file-system-cache@npm:2.3.0": - version: 2.3.0 - resolution: "file-system-cache@npm:2.3.0" - dependencies: - fs-extra: 11.1.1 - ramda: 0.29.0 - checksum: 74afa2870a062500643d41e02d1fbd47a3f30100f9e153dec5233d59f05545f4c8ada6085629d624e043479ac28c0cafc31824f7b49a3f997efab8cc5d05bfee - languageName: node - linkType: hard - "file-system-cache@npm:^1.0.5": version: 1.1.0 resolution: "file-system-cache@npm:1.1.0" @@ -17268,6 +16368,20 @@ __metadata: languageName: node linkType: hard +"filter-obj@npm:^1.1.0": + version: 1.1.0 + resolution: "filter-obj@npm:1.1.0" + checksum: cf2104a7c45ff48e7f505b78a3991c8f7f30f28bd8106ef582721f321f1c6277f7751aacd5d83026cb079d9d5091082f588d14a72e7c5d720ece79118fa61e10 + languageName: node + linkType: hard + +"filter-obj@npm:^3.0.0": + version: 3.0.0 + resolution: "filter-obj@npm:3.0.0" + checksum: 93bee3cecc2bbd87cb9d786c4ba2ea36fbad5d237aec991deed419dcc892020dd46d0a77c982224ef45d922b1573c77be1588274b9d524c7389ccf8d1a91c330 + languageName: node + linkType: hard + "finalhandler@npm:1.1.2": version: 1.1.2 resolution: "finalhandler@npm:1.1.2" @@ -17319,7 +16433,7 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^3.0.0, find-cache-dir@npm:^3.3.1": +"find-cache-dir@npm:^3.3.1": version: 3.3.2 resolution: "find-cache-dir@npm:3.3.2" dependencies: @@ -17498,16 +16612,6 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^2.0.0": - version: 2.0.0 - resolution: "foreground-child@npm:2.0.0" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^3.0.2 - checksum: f77ec9aff621abd6b754cb59e690743e7639328301fbea6ff09df27d2befaf7dd5b77cec51c32323d73a81a7d91caaf9413990d305cbe3d873eec4fe58960956 - languageName: node - linkType: hard - "foreground-child@npm:^3.1.0": version: 3.1.1 resolution: "foreground-child@npm:3.1.1" @@ -17655,17 +16759,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:11.1.1, fs-extra@npm:^11.1.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd - languageName: node - linkType: hard - "fs-extra@npm:9.0.0": version: 9.0.0 resolution: "fs-extra@npm:9.0.0" @@ -17701,6 +16794,17 @@ __metadata: languageName: node linkType: hard +"fs-extra@npm:^11.1.0": + version: 11.1.1 + resolution: "fs-extra@npm:11.1.1" + dependencies: + graceful-fs: ^4.2.0 + jsonfile: ^6.0.1 + universalify: ^2.0.0 + checksum: fb883c68245b2d777fbc1f2082c9efb084eaa2bbf9fddaa366130d196c03608eebef7fb490541276429ee1ca99f317e2d73e96f5ca0999eefedf5a624ae1edfd + languageName: node + linkType: hard + "fs-extra@npm:^7.0.1": version: 7.0.1 resolution: "fs-extra@npm:7.0.1" @@ -17949,20 +17053,6 @@ __metadata: languageName: node linkType: hard -"get-nonce@npm:^1.0.0": - version: 1.0.1 - resolution: "get-nonce@npm:1.0.1" - checksum: e2614e43b4694c78277bb61b0f04583d45786881289285c73770b07ded246a98be7e1f78b940c80cbe6f2b07f55f0b724e6db6fd6f1bcbd1e8bdac16521074ed - languageName: node - linkType: hard - -"get-npm-tarball-url@npm:^2.0.3": - version: 2.1.0 - resolution: "get-npm-tarball-url@npm:2.1.0" - checksum: 02b96993ad5a04cbd0ef0577ac3cc9e2e78a7c60db6bb5e6c8fe78950fc1fc3d093314987629a2fda3083228d91a93670bde321767ca2cf89ce7f463c9e44071 - languageName: node - linkType: hard - "get-own-enumerable-property-symbols@npm:^3.0.0": version: 3.0.2 resolution: "get-own-enumerable-property-symbols@npm:3.0.2" @@ -17991,7 +17081,7 @@ __metadata: languageName: node linkType: hard -"get-port@npm:5.1.1, get-port@npm:^5.1.1": +"get-port@npm:5.1.1": version: 5.1.1 resolution: "get-port@npm:5.1.1" checksum: 0162663ffe5c09e748cd79d97b74cd70e5a5c84b760a475ce5767b357fb2a57cb821cee412d646aa8a156ed39b78aab88974eddaa9e5ee926173c036c0713787 @@ -18070,23 +17160,6 @@ __metadata: languageName: node linkType: hard -"giget@npm:^1.0.0": - version: 1.1.3 - resolution: "giget@npm:1.1.3" - dependencies: - colorette: ^2.0.20 - defu: ^6.1.2 - https-proxy-agent: ^7.0.2 - mri: ^1.2.0 - node-fetch-native: ^1.4.0 - pathe: ^1.1.1 - tar: ^6.2.0 - bin: - giget: dist/cli.mjs - checksum: 1a88b29e3eed2c3593a60f92f54512c9b885117b12c3bb8febd6b504c3f101030b7b0270a912c30b6cb9b177539af3c64cddd2c8a5dbda5a155f65426bd3fbf7 - languageName: node - linkType: hard - "git-raw-commits@npm:^2.0.8": version: 2.0.11 resolution: "git-raw-commits@npm:2.0.11" @@ -18152,13 +17225,6 @@ __metadata: languageName: node linkType: hard -"github-slugger@npm:^1.0.0": - version: 1.5.0 - resolution: "github-slugger@npm:1.5.0" - checksum: c70988224578b3bdaa25df65973ffc8c24594a77a28550c3636e495e49d17aef5cdb04c04fa3f1744babef98c61eecc6a43299a13ea7f3cc33d680bf9053ffbe - languageName: node - linkType: hard - "glob-parent@npm:5.1.2, glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -18324,7 +17390,7 @@ __metadata: languageName: node linkType: hard -"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.0.2, globby@npm:^11.1.0": +"globby@npm:11.1.0, globby@npm:^11.0.0, globby@npm:^11.0.1, globby@npm:^11.1.0": version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: @@ -18406,22 +17472,6 @@ __metadata: languageName: node linkType: hard -"gunzip-maybe@npm:^1.4.2": - version: 1.4.2 - resolution: "gunzip-maybe@npm:1.4.2" - dependencies: - browserify-zlib: ^0.1.4 - is-deflate: ^1.0.0 - is-gzip: ^1.0.0 - peek-stream: ^1.1.0 - pumpify: ^1.3.3 - through2: ^2.0.3 - bin: - gunzip-maybe: bin.js - checksum: bc4d4977c24a2860238df271de75d53dd72a359d19f1248d1c613807dc221d3b8ae09624e3085c8106663e3e1b59db62a85b261d1138c2cc24efad9df577d4e1 - languageName: node - linkType: hard - "gzip-size@npm:^3.0.0": version: 3.0.0 resolution: "gzip-size@npm:3.0.0" @@ -18696,6 +17746,13 @@ __metadata: languageName: node linkType: hard +"highlightjs-vue@npm:^1.0.0": + version: 1.0.0 + resolution: "highlightjs-vue@npm:1.0.0" + checksum: 895f2dd22c93a441aca7df8d21f18c00697537675af18832e50810a071715f79e45eda677e6244855f325234c6a06f7bd76f8f20bd602040fc350c80ac7725e4 + languageName: node + linkType: hard + "hmac-drbg@npm:^1.0.1": version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" @@ -18840,13 +17897,6 @@ __metadata: languageName: node linkType: hard -"html-tags@npm:^3.1.0": - version: 3.3.1 - resolution: "html-tags@npm:3.3.1" - checksum: b4ef1d5a76b678e43cce46e3783d563607b1d550cab30b4f511211564574770aa8c658a400b100e588bc60b8234e59b35ff72c7851cc28f3b5403b13a2c6cbce - languageName: node - linkType: hard - "html-webpack-plugin@npm:^5.5.0": version: 5.5.3 resolution: "html-webpack-plugin@npm:5.5.3" @@ -19013,16 +18063,6 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^4.0.0": - version: 4.0.0 - resolution: "https-proxy-agent@npm:4.0.0" - dependencies: - agent-base: 5 - debug: 4 - checksum: 19471d5aae3e747b1c98b17556647e2a1362e68220c6b19585a8527498f32e62e03c41d2872d059d8720d56846bd7460a80ac06f876bccfa786468ff40dd5eef - languageName: node - linkType: hard - "https-proxy-agent@npm:^5.0.0, https-proxy-agent@npm:^5.0.1": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" @@ -19033,7 +18073,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.2": +"https-proxy-agent@npm:^7.0.1": version: 7.0.2 resolution: "https-proxy-agent@npm:7.0.2" dependencies: @@ -19100,6 +18140,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.7.0": + version: 0.7.2 + resolution: "iconv-lite@npm:0.7.2" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: faf884c1f631a5d676e3e64054bed891c7c5f616b790082d99ccfbfd017c661a39db8009160268fd65fae57c9154d4d491ebc9c301f3446a078460ef114dc4b8 + languageName: node + linkType: hard + "icss-replace-symbols@npm:^1.1.0": version: 1.1.0 resolution: "icss-replace-symbols@npm:1.1.0" @@ -19381,6 +18430,29 @@ __metadata: languageName: node linkType: hard +"inquirer@npm:^8.2.5": + version: 8.2.7 + resolution: "inquirer@npm:8.2.7" + dependencies: + "@inquirer/external-editor": ^1.0.0 + ansi-escapes: ^4.2.1 + chalk: ^4.1.1 + cli-cursor: ^3.1.0 + cli-width: ^3.0.0 + figures: ^3.0.0 + lodash: ^4.17.21 + mute-stream: 0.0.8 + ora: ^5.4.1 + run-async: ^2.4.0 + rxjs: ^7.5.5 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + through: ^2.3.6 + wrap-ansi: ^6.0.1 + checksum: b7e39a04da31207826f675e2ff491bd35bb28efbe336e8fb49641d8353d4a312943514452fb0a23702e64f70c7e44188586880c902d67541aae579cd6564c3fb + languageName: node + linkType: hard + "internal-ip@npm:4.3.0": version: 4.3.0 resolution: "internal-ip@npm:4.3.0" @@ -19464,13 +18536,6 @@ __metadata: languageName: node linkType: hard -"is-absolute-url@npm:^3.0.0": - version: 3.0.3 - resolution: "is-absolute-url@npm:3.0.3" - checksum: 5159b51d065d9ad29e16a2f78d6c0e41c43227caf90a45e659c54ea6fd50ef0595b1871ce392e84b1df7cfdcad9a8e66eec0813a029112188435abf115accb16 - languageName: node - linkType: hard - "is-accessor-descriptor@npm:^1.0.1": version: 1.0.1 resolution: "is-accessor-descriptor@npm:1.0.1" @@ -19642,6 +18707,15 @@ __metadata: languageName: node linkType: hard +"is-core-module@npm:^2.16.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" + dependencies: + hasown: ^2.0.2 + checksum: 6ec5b3c42d9cbf1ac23f164b16b8a140c3cec338bf8f884c076ca89950c7cc04c33e78f02b8cae7ff4751f3247e3174b2330f1fe4de194c7210deb8b1ea316a7 + languageName: node + linkType: hard + "is-data-descriptor@npm:^1.0.1": version: 1.0.1 resolution: "is-data-descriptor@npm:1.0.1" @@ -19676,13 +18750,6 @@ __metadata: languageName: node linkType: hard -"is-deflate@npm:^1.0.0": - version: 1.0.0 - resolution: "is-deflate@npm:1.0.0" - checksum: c2f9f2d3db79ac50c5586697d1e69a55282a2b0cc5e437b3c470dd47f24e40b6216dcd7e024511e21381607bf57afa019343e3bd0e08a119032818b596004262 - languageName: node - linkType: hard - "is-descriptor@npm:^0.1.0": version: 0.1.7 resolution: "is-descriptor@npm:0.1.7" @@ -19839,13 +18906,6 @@ __metadata: languageName: node linkType: hard -"is-gzip@npm:^1.0.0": - version: 1.0.0 - resolution: "is-gzip@npm:1.0.0" - checksum: 0d28931c1f445fa29c900cf9f48e06e9d1d477a3bf7bd7332e7ce68f1333ccd8cb381de2f0f62a9a262d9c0912608a9a71b4a40e788e201b3dbd67072bb20d86 - languageName: node - linkType: hard - "is-hexadecimal@npm:^1.0.0": version: 1.0.4 resolution: "is-hexadecimal@npm:1.0.4" @@ -19897,16 +18957,6 @@ __metadata: languageName: node linkType: hard -"is-nan@npm:^1.3.2": - version: 1.3.2 - resolution: "is-nan@npm:1.3.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - checksum: 5dfadcef6ad12d3029d43643d9800adbba21cf3ce2ec849f734b0e14ee8da4070d82b15fdb35138716d02587c6578225b9a22779cab34888a139cc43e4e3610a - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" @@ -19995,13 +19045,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:5.0.0, is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c - languageName: node - linkType: hard - "is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -20011,6 +19054,13 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + "is-potential-custom-element-name@npm:^1.0.1": version: 1.0.1 resolution: "is-potential-custom-element-name@npm:1.0.1" @@ -20332,7 +19382,7 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3, istanbul-reports@npm:^3.1.4": +"istanbul-reports@npm:^3.1.3": version: 3.1.6 resolution: "istanbul-reports@npm:3.1.6" dependencies: @@ -20616,29 +19666,6 @@ __metadata: languageName: node linkType: hard -"jest-haste-map@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-haste-map@npm:29.7.0" - dependencies: - "@jest/types": ^29.6.3 - "@types/graceful-fs": ^4.1.3 - "@types/node": "*" - anymatch: ^3.0.3 - fb-watchman: ^2.0.0 - fsevents: ^2.3.2 - graceful-fs: ^4.2.9 - jest-regex-util: ^29.6.3 - jest-util: ^29.7.0 - jest-worker: ^29.7.0 - micromatch: ^4.0.4 - walker: ^1.0.8 - dependenciesMeta: - fsevents: - optional: true - checksum: c2c8f2d3e792a963940fbdfa563ce14ef9e14d4d86da645b96d3cd346b8d35c5ce0b992ee08593939b5f718cf0a1f5a90011a056548a1dbf58397d4356786f01 - languageName: node - linkType: hard - "jest-jasmine2@npm:^27.5.1": version: 27.5.1 resolution: "jest-jasmine2@npm:27.5.1" @@ -20720,7 +19747,7 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:^27.0.6, jest-mock@npm:^27.5.1": +"jest-mock@npm:^27.5.1": version: 27.5.1 resolution: "jest-mock@npm:27.5.1" dependencies: @@ -20760,13 +19787,6 @@ __metadata: languageName: node linkType: hard -"jest-regex-util@npm:^29.6.3": - version: 29.6.3 - resolution: "jest-regex-util@npm:29.6.3" - checksum: 0518beeb9bf1228261695e54f0feaad3606df26a19764bc19541e0fc6e2a3737191904607fb72f3f2ce85d9c16b28df79b7b1ec9443aa08c3ef0e9efda6f8f2a - languageName: node - linkType: hard - "jest-resolve-dependencies@npm:^27.5.1": version: 27.5.1 resolution: "jest-resolve-dependencies@npm:27.5.1" @@ -20988,18 +20008,6 @@ __metadata: languageName: node linkType: hard -"jest-worker@npm:^29.7.0": - version: 29.7.0 - resolution: "jest-worker@npm:29.7.0" - dependencies: - "@types/node": "*" - jest-util: ^29.7.0 - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 - languageName: node - linkType: hard - "jest@npm:^27.5.1": version: 27.5.1 resolution: "jest@npm:27.5.1" @@ -21025,15 +20033,6 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.18.2": - version: 1.21.0 - resolution: "jiti@npm:1.21.0" - bin: - jiti: bin/jiti.js - checksum: a7bd5d63921c170eaec91eecd686388181c7828e1fa0657ab374b9372bfc1f383cf4b039e6b272383d5cb25607509880af814a39abdff967322459cca41f2961 - languageName: node - linkType: hard - "joi@npm:^17.2.1": version: 17.11.0 resolution: "joi@npm:17.11.0" @@ -21077,16 +20076,9 @@ __metadata: linkType: hard "joycon@npm:^3.1.1": - version: 3.1.1 - resolution: "joycon@npm:3.1.1" - checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 - languageName: node - linkType: hard - -"js-sha256@npm:^0.9.0": - version: 0.9.0 - resolution: "js-sha256@npm:0.9.0" - checksum: ffad54b3373f81581e245866abfda50a62c483803a28176dd5c28fd2d313e0bdf830e77dac7ff8afd193c53031618920f3d98daf21cbbe80082753ab639c0365 + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 8003c9c3fc79c5c7602b1c7e9f7a2df2e9916f046b0dbad862aa589be78c15734d11beb9fe846f5e06138df22cb2ad29961b6a986ba81c4920ce2b15a7f11067 languageName: node linkType: hard @@ -21165,6 +20157,13 @@ __metadata: languageName: node linkType: hard +"jsdoc-type-pratt-parser@npm:^4.0.0": + version: 4.8.0 + resolution: "jsdoc-type-pratt-parser@npm:4.8.0" + checksum: 54c17ca55a1091e2ae18ebaba2cbdd72bbe0976c011428a86ea78fd963157608018c4bd975089f251027f3106679fa288db4c98580d81ce7cf3f760e1489ce58 + languageName: node + linkType: hard + "jsdom@npm:^16.6.0": version: 16.7.0 resolution: "jsdom@npm:16.7.0" @@ -21214,6 +20213,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f + languageName: node + linkType: hard + "jsesc@npm:~0.5.0": version: 0.5.0 resolution: "jsesc@npm:0.5.0" @@ -21488,9 +20496,9 @@ __metadata: eslint-plugin-react: ^7.34.4 eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-react-refresh: ^0.4.5 - react: ^18.2.0 + react: ^19.0.0 react-color: ^2.19.3 - react-dom: ^18.2.0 + react-dom: ^19.0.0 react-resizable-panels: ^2.0.20 react-syntax-highlighter: ^15.5.0 vite: ^5.1.0 @@ -21511,17 +20519,6 @@ __metadata: languageName: node linkType: hard -"lazy-universal-dotenv@npm:^4.0.0": - version: 4.0.0 - resolution: "lazy-universal-dotenv@npm:4.0.0" - dependencies: - app-root-dir: ^1.0.2 - dotenv: ^16.0.0 - dotenv-expand: ^10.0.0 - checksum: 196e0d701100144fbfe078d604a477573413ebf38dfe8d543748605e6a7074978508a3bb9f8135acd319db4fa947eef78836497163617d15a22163c59a00996b - languageName: node - linkType: hard - "lerna@npm:^6.6.2": version: 6.6.2 resolution: "lerna@npm:6.6.2" @@ -21608,16 +20605,6 @@ __metadata: languageName: node linkType: hard -"less-loader@npm:^11.1.0": - version: 11.1.3 - resolution: "less-loader@npm:11.1.3" - peerDependencies: - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 - checksum: fe0de6b5ab930a4521d04555d9bd77723164bfa0f71eb5724d91c45090af544000e2d7f598cd83ec4e1445e6b943cc0c0dd1445fb2e83fd7c12f4ad3a0db05c5 - languageName: node - linkType: hard - "leven@npm:^3.1.0": version: 3.1.0 resolution: "leven@npm:3.1.0" @@ -21955,7 +20942,7 @@ __metadata: languageName: node linkType: hard -"loader-utils@npm:^2.0.0, loader-utils@npm:^2.0.4": +"loader-utils@npm:^2.0.0": version: 2.0.4 resolution: "loader-utils@npm:2.0.4" dependencies: @@ -22166,6 +21153,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0, loupe@npm:^3.1.1, loupe@npm:^3.1.2": + version: 3.2.1 + resolution: "loupe@npm:3.2.1" + checksum: 3ce9ecc5b2c56ffc073bf065ad3a4644cccce3eac81e61a8732e9c8ebfe05513ed478592d25f9dba24cfe82766913be045ab384c04711c7c6447deaf800ad94c + languageName: node + linkType: hard + "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -22192,7 +21186,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^4.0.1, lru-cache@npm:^4.1.1": +"lru-cache@npm:^4.0.1": version: 4.1.5 resolution: "lru-cache@npm:4.1.5" dependencies: @@ -22272,6 +21266,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.5": + version: 0.30.21 + resolution: "magic-string@npm:0.30.21" + dependencies: + "@jridgewell/sourcemap-codec": ^1.5.5 + checksum: 4ff76a4e8d439431cf49f039658751ed351962d044e5955adc257489569bd676019c906b631f86319217689d04815d7d064ee3ff08ab82ae65b7655a7e82a414 + languageName: node + linkType: hard + "make-dir@npm:3.1.0, make-dir@npm:^3.0.2, make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" @@ -22375,15 +21378,6 @@ __metadata: languageName: node linkType: hard -"map-age-cleaner@npm:^0.1.1": - version: 0.1.3 - resolution: "map-age-cleaner@npm:0.1.3" - dependencies: - p-defer: ^1.0.0 - checksum: cb2804a5bcb3cbdfe4b59066ea6d19f5e7c8c196cd55795ea4c28f792b192e4c442426ae52524e5e1acbccf393d3bddacefc3d41f803e66453f6c4eda3650bc1 - languageName: node - linkType: hard - "map-cache@npm:^0.2.2": version: 0.2.2 resolution: "map-cache@npm:0.2.2" @@ -22428,15 +21422,6 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.1.8": - version: 7.3.2 - resolution: "markdown-to-jsx@npm:7.3.2" - peerDependencies: - react: ">= 0.14.0" - checksum: 8885c6343b71570b0a7ec16cd85a49b853a830234790ee7430e2517ea5d8d361ff138bd52147f650790f3e7b3a28a15c755fc16f8856dd01ddf09a6161782e06 - languageName: node - linkType: hard - "material-colors@npm:^1.2.1": version: 1.2.6 resolution: "material-colors@npm:1.2.6" @@ -22507,22 +21492,6 @@ __metadata: languageName: node linkType: hard -"mdast-util-definitions@npm:^4.0.0": - version: 4.0.0 - resolution: "mdast-util-definitions@npm:4.0.0" - dependencies: - unist-util-visit: ^2.0.0 - checksum: 2325f20b82b3fb8cb5fda77038ee0bbdd44f82cfca7c48a854724b58bc1fe5919630a3ce7c45e210726df59d46c881d020b2da7a493bfd1ee36eb2bbfef5d78e - languageName: node - linkType: hard - -"mdast-util-to-string@npm:^1.0.0": - version: 1.1.0 - resolution: "mdast-util-to-string@npm:1.1.0" - checksum: eec1eb283f3341376c8398b67ce512a11ab3e3191e3dbd5644d32a26784eac8d5f6d0b0fb81193af00d75a2c545cde765c8b03e966bd890076efb5d357fb4fe2 - languageName: node - linkType: hard - "mdn-data@npm:2.0.14": version: 2.0.14 resolution: "mdn-data@npm:2.0.14" @@ -22537,17 +21506,6 @@ __metadata: languageName: node linkType: hard -"mem@npm:^4.0.0": - version: 4.3.0 - resolution: "mem@npm:4.3.0" - dependencies: - map-age-cleaner: ^0.1.1 - mimic-fn: ^2.0.0 - p-is-promise: ^2.0.0 - checksum: cf488608e5d59c6cb68004b70de317222d4be9f857fd535dfa6a108e04f40821479c080bc763c417b1030569d303538c59d441280078cfce07fefd1c523f98ef - languageName: node - linkType: hard - "memfs@npm:^3.1.2, memfs@npm:^3.4.1, memfs@npm:^3.4.12": version: 3.5.3 resolution: "memfs@npm:3.5.3" @@ -23179,7 +22137,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.25, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -23206,7 +22164,7 @@ __metadata: languageName: node linkType: hard -"mime@npm:^2.0.3, mime@npm:^2.4.1, mime@npm:^2.4.4": +"mime@npm:^2.4.1, mime@npm:^2.4.4": version: 2.6.0 resolution: "mime@npm:2.6.0" bin: @@ -23222,7 +22180,7 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^2.0.0, mimic-fn@npm:^2.1.0": +"mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a @@ -23507,13 +22465,6 @@ __metadata: languageName: node linkType: hard -"mkdirp-classic@npm:^0.5.2": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac - languageName: node - linkType: hard - "mkdirp-infer-owner@npm:^2.0.0": version: 2.0.0 resolution: "mkdirp-infer-owner@npm:2.0.0" @@ -23525,7 +22476,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:^0.5.4, mkdirp@npm:~0.5.1": +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.3, mkdirp@npm:~0.5.1": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -23579,13 +22530,6 @@ __metadata: languageName: node linkType: hard -"mri@npm:^1.2.0": - version: 1.2.0 - resolution: "mri@npm:1.2.0" - checksum: 83f515abbcff60150873e424894a2f65d68037e5a7fcde8a9e2b285ee9c13ac581b63cfc1e6826c4732de3aeb84902f7c1e16b7aff46cd3f897a0f757a894e85 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -23831,7 +22775,7 @@ __metadata: languageName: node linkType: hard -"node-dir@npm:^0.1.10, node-dir@npm:^0.1.17": +"node-dir@npm:^0.1.17": version: 0.1.17 resolution: "node-dir@npm:0.1.17" dependencies: @@ -23840,13 +22784,6 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.4.0": - version: 1.4.1 - resolution: "node-fetch-native@npm:1.4.1" - checksum: 339001ad3235a09b195198df8be71b591eec4064a2fcfb7f54b9f0716f6ccb3bda5828e1746f809a6d2edb062a0330e5798f408396c33b3b88339c73d6e9575d - languageName: node - linkType: hard - "node-fetch@npm:1.6.3": version: 1.6.3 resolution: "node-fetch@npm:1.6.3" @@ -23871,7 +22808,7 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.0.0, node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": +"node-fetch@npm:^2.2.0, node-fetch@npm:^2.6.0, node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12, node-fetch@npm:^2.6.7": version: 2.7.0 resolution: "node-fetch@npm:2.7.0" dependencies: @@ -24020,6 +22957,13 @@ __metadata: languageName: node linkType: hard +"node-releases@npm:^2.0.36": + version: 2.0.38 + resolution: "node-releases@npm:2.0.38" + checksum: fe5af7b5928d06783534b38d0c55e3467b719a8a53acc2fd15f7f2d2ef4cedb38ae411cce59e2c10027827650c81897c41045e742131b9b5e4d118ce1b307025 + languageName: node + linkType: hard + "node-stream-zip@npm:^1.9.1": version: 1.15.0 resolution: "node-stream-zip@npm:1.15.0" @@ -24918,13 +23862,6 @@ __metadata: languageName: node linkType: hard -"p-defer@npm:^1.0.0": - version: 1.0.0 - resolution: "p-defer@npm:1.0.0" - checksum: 4271b935c27987e7b6f229e5de4cdd335d808465604644cb7b4c4c95bef266735859a93b16415af8a41fd663ee9e3b97a1a2023ca9def613dba1bad2a0da0c7b - languageName: node - linkType: hard - "p-filter@npm:^2.1.0": version: 2.1.0 resolution: "p-filter@npm:2.1.0" @@ -24941,13 +23878,6 @@ __metadata: languageName: node linkType: hard -"p-is-promise@npm:^2.0.0": - version: 2.1.0 - resolution: "p-is-promise@npm:2.1.0" - checksum: c9a8248c8b5e306475a5d55ce7808dbce4d4da2e3d69526e4991a391a7809bfd6cfdadd9bf04f1c96a3db366c93d9a0f5ee81d949e7b1684c4e0f61f747199ef - languageName: node - linkType: hard - "p-limit@npm:^1.1.0": version: 1.3.0 resolution: "p-limit@npm:1.3.0" @@ -25108,6 +24038,15 @@ __metadata: languageName: node linkType: hard +"package-manager-detector@npm:^0.2.0": + version: 0.2.11 + resolution: "package-manager-detector@npm:0.2.11" + dependencies: + quansync: ^0.2.7 + checksum: cea626a294f04028ea291bf0a5a32a21e3914daef4f3959e708ae36f8f2d8097d813e8bb488f5d2b6edaf43a976c6a3d2c361ef8dd9a12c360a7129cd8e29e0f + languageName: node + linkType: hard + "pacote@npm:15.1.1": version: 15.1.1 resolution: "pacote@npm:15.1.1" @@ -25164,13 +24103,6 @@ __metadata: languageName: node linkType: hard -"pako@npm:~0.2.0": - version: 0.2.9 - resolution: "pako@npm:0.2.9" - checksum: 055f9487cd57fbb78df84315873bbdd089ba286f3499daed47d2effdc6253e981f5db6898c23486de76d4a781559f890d643bd3a49f70f1b4a18019c98aa5125 - languageName: node - linkType: hard - "pako@npm:~1.0.5": version: 1.0.11 resolution: "pako@npm:1.0.11" @@ -25479,10 +24411,10 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^1.1.1": - version: 1.1.1 - resolution: "pathe@npm:1.1.1" - checksum: 34ab3da2e5aa832ebc6a330ffe3f73d7ba8aec6e899b53b8ec4f4018de08e40742802deb12cf5add9c73b7bf719b62c0778246bd376ca62b0fb23e0dde44b759 +"pathval@npm:^2.0.0": + version: 2.0.1 + resolution: "pathval@npm:2.0.1" + checksum: 280e71cfd86bb5d7ff371fe2752997e5fa82901fcb209abf19d4457b7814f1b4a17845dfb17bd28a596ccdb0ecea178720ce23dacfa9c841f37804b700647810 languageName: node linkType: hard @@ -25508,24 +24440,6 @@ __metadata: languageName: node linkType: hard -"peek-stream@npm:^1.1.0": - version: 1.1.3 - resolution: "peek-stream@npm:1.1.3" - dependencies: - buffer-from: ^1.0.0 - duplexify: ^3.5.0 - through2: ^2.0.3 - checksum: a0e09d6d1a8a01158a3334f20d6b1cdd91747eba24eb06a1d742eefb620385593121a76d4378cc81f77cdce6a66df0575a41041b1189c510254aec91878afc99 - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d - languageName: node - linkType: hard - "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" @@ -25533,6 +24447,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -25811,20 +24732,6 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:^7.2.4": - version: 7.3.3 - resolution: "postcss-loader@npm:7.3.3" - dependencies: - cosmiconfig: ^8.2.0 - jiti: ^1.18.2 - semver: ^7.3.8 - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - checksum: c724044d6ae56334535c26bb4efc9c151431d44d60bc8300157c760747281a242757d8dab32db72738434531175b38a408cb0b270bb96207c07584dcfcd899ff - languageName: node - linkType: hard - "postcss-merge-longhand@npm:^5.1.7": version: 5.1.7 resolution: "postcss-merge-longhand@npm:5.1.7" @@ -26135,7 +25042,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.2.14, postcss@npm:^8.4.21, postcss@npm:^8.4.27": +"postcss@npm:^8.4.21, postcss@npm:^8.4.27": version: 8.4.31 resolution: "postcss@npm:8.4.31" dependencies: @@ -26222,7 +25129,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^2.4.1, prettier@npm:^2.7.1, prettier@npm:^2.8.0, prettier@npm:^2.8.1": +"prettier@npm:^2.4.1, prettier@npm:^2.7.1, prettier@npm:^2.8.1": version: 2.8.8 resolution: "prettier@npm:2.8.8" bin: @@ -26351,7 +25258,7 @@ __metadata: languageName: node linkType: hard -"progress@npm:2.0.3, progress@npm:^2.0.1": +"progress@npm:2.0.3": version: 2.0.3 resolution: "progress@npm:2.0.3" checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 @@ -26504,7 +25411,7 @@ __metadata: languageName: node linkType: hard -"proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0": +"proxy-from-env@npm:^1.1.0": version: 1.1.0 resolution: "proxy-from-env@npm:1.1.0" checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 @@ -26598,24 +25505,6 @@ __metadata: languageName: node linkType: hard -"puppeteer-core@npm:^2.1.1": - version: 2.1.1 - resolution: "puppeteer-core@npm:2.1.1" - dependencies: - "@types/mime-types": ^2.1.0 - debug: ^4.1.0 - extract-zip: ^1.6.6 - https-proxy-agent: ^4.0.0 - mime: ^2.0.3 - mime-types: ^2.1.25 - progress: ^2.0.1 - proxy-from-env: ^1.0.0 - rimraf: ^2.6.1 - ws: ^6.1.0 - checksum: 2ddb597ef1b2d162b4aa49833b977734129edf7c8fa558fc38c59d273e79aa1bd079481c642de87f7163665f7f37aa52683da2716bafb7d3cab68c262c36ec28 - languageName: node - linkType: hard - "q@npm:^1.5.1": version: 1.5.1 resolution: "q@npm:1.5.1" @@ -26650,6 +25539,25 @@ __metadata: languageName: node linkType: hard +"quansync@npm:^0.2.7": + version: 0.2.11 + resolution: "quansync@npm:0.2.11" + checksum: af484ed433f752c092d278232f68a6643e2cf0193f95ec60c84245e1f3662ef64da90f8fb1bc57dd407362ff181f246a9304ba53725dd7122f45c4a839f85a61 + languageName: node + linkType: hard + +"query-string@npm:^7.1.3": + version: 7.1.3 + resolution: "query-string@npm:7.1.3" + dependencies: + decode-uri-component: ^0.2.2 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 91af02dcd9cc9227a052841d5c2eecb80a0d6489d05625df506a097ef1c59037cfb5e907f39b84643cbfd535c955abec3e553d0130a7b510120c37d06e0f4346 + languageName: node + linkType: hard + "querystring-es3@npm:^0.2.0": version: 0.2.1 resolution: "querystring-es3@npm:0.2.1" @@ -26678,13 +25586,6 @@ __metadata: languageName: node linkType: hard -"ramda@npm:0.29.0": - version: 0.29.0 - resolution: "ramda@npm:0.29.0" - checksum: 9ab26c06eb7545cbb7eebcf75526d6ee2fcaae19e338f165b2bf32772121e7b28192d6664d1ba222ff76188ba26ab307342d66e805dbb02c860560adc4d5dd57 - languageName: node - linkType: hard - "ramda@npm:^0.28.0": version: 0.28.0 resolution: "ramda@npm:0.28.0" @@ -26692,6 +25593,16 @@ __metadata: languageName: node linkType: hard +"randexp@npm:^0.5.3": + version: 0.5.3 + resolution: "randexp@npm:0.5.3" + dependencies: + drange: ^1.0.2 + ret: ^0.2.0 + checksum: 9a4011b4b012debea545fc379a18208876fffc1179d2ac211351caf7626a3956efc4bc41e329bc5b241a671553eda58e0703933a9bcfdf90dde501ba1a2cf40a + languageName: node + linkType: hard + "randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -26773,16 +25684,6 @@ __metadata: languageName: node linkType: hard -"react-colorful@npm:^5.1.2": - version: 5.6.1 - resolution: "react-colorful@npm:5.6.1" - peerDependencies: - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: e432b7cb0df57e8f0bcdc3b012d2e93fcbcb6092c9e0f85654788d5ebfc4442536d8cc35b2418061ba3c4afb8b7788cc101c606d86a1732407921de7a9244c8d - languageName: node - linkType: hard - "react-devtools-core@npm:^4.26.1": version: 4.28.5 resolution: "react-devtools-core@npm:4.28.5" @@ -26802,62 +25703,32 @@ __metadata: languageName: node linkType: hard -"react-docgen@npm:^5.0.0": - version: 5.4.3 - resolution: "react-docgen@npm:5.4.3" - dependencies: - "@babel/core": ^7.7.5 - "@babel/generator": ^7.12.11 - "@babel/runtime": ^7.7.6 - ast-types: ^0.14.2 - commander: ^2.19.0 +"react-docgen@npm:^7.0.0": + version: 7.1.1 + resolution: "react-docgen@npm:7.1.1" + dependencies: + "@babel/core": ^7.18.9 + "@babel/traverse": ^7.18.9 + "@babel/types": ^7.18.9 + "@types/babel__core": ^7.18.0 + "@types/babel__traverse": ^7.18.0 + "@types/doctrine": ^0.0.9 + "@types/resolve": ^1.20.2 doctrine: ^3.0.0 - estree-to-babel: ^3.1.0 - neo-async: ^2.6.1 - node-dir: ^0.1.10 - strip-indent: ^3.0.0 - bin: - react-docgen: bin/react-docgen.js - checksum: cef935ba948195eaeec9126c62f53bc015b9a5ad3a7eeb4a4604668d5b12bd5d0c9058c279eaf33ee6b47f2a24ccf01818b67af64d7f61265c4d3a5aa4ff0a3a - languageName: node - linkType: hard - -"react-dom@npm:18.2.0, react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" - dependencies: - loose-envify: ^1.1.0 - scheduler: ^0.23.0 - peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc - languageName: node - linkType: hard - -"react-dom@npm:^17.0.2": - version: 17.0.2 - resolution: "react-dom@npm:17.0.2" - dependencies: - loose-envify: ^1.1.0 - object-assign: ^4.1.1 - scheduler: ^0.20.2 - peerDependencies: - react: 17.0.2 - checksum: 1c1eaa3bca7c7228d24b70932e3d7c99e70d1d04e13bb0843bbf321582bc25d7961d6b8a6978a58a598af2af496d1cedcfb1bf65f6b0960a0a8161cb8dab743c + resolve: ^1.22.1 + strip-indent: ^4.0.0 + checksum: 634bc3d7a5c930f3ac4882a426acd3925876f38dec3b93db343aa84af411bcc6502d8e9afd7e5a61f97f79be556b7d51ee930279c00c4efc47bd86c731090527 languageName: node linkType: hard -"react-element-to-jsx-string@npm:^15.0.0": - version: 15.0.0 - resolution: "react-element-to-jsx-string@npm:15.0.0" +"react-dom@npm:^19.0.0": + version: 19.2.5 + resolution: "react-dom@npm:19.2.5" dependencies: - "@base2/pretty-print-object": 1.0.1 - is-plain-object: 5.0.0 - react-is: 18.1.0 + scheduler: ^0.27.0 peerDependencies: - react: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - react-dom: ^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0 - checksum: c3907cc4c1d3e9ecc8ca7727058ebcba6ec89848d9e07bfd2c77ee8f28f1ad99bf55e38359dec8a1125de83d41ac09a2874f53c41415edc86ffa9840fa1b7856 + react: ^19.2.5 + checksum: a63e892755d14524a2cb76f750ca8d75b8c91473d806f0441035b3ae74ecaa3ab4cecf820cf40e5aa33631de9aecdeeb2e00a302d447f42794d32969070fabec languageName: node linkType: hard @@ -26881,22 +25752,6 @@ __metadata: languageName: node linkType: hard -"react-inspector@npm:^6.0.0": - version: 6.0.2 - resolution: "react-inspector@npm:6.0.2" - peerDependencies: - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - checksum: dab7a7daf570c283fdc5d4e07ee8941ee8670af698ab5a27a704602b248e29ab911b117310d64c30a4af93931b2d6ee2a729369e3f5ab7f02df4651692e195a5 - languageName: node - linkType: hard - -"react-is@npm:18.1.0": - version: 18.1.0 - resolution: "react-is@npm:18.1.0" - checksum: d206a0fe6790851bff168727bfb896de02c5591695afb0c441163e8630136a3e13ee1a7ddd59fdccddcc93968b4721ae112c10f790b194b03b35a3dc13a355ef - languageName: node - linkType: hard - "react-is@npm:^16.12.0 || ^17.0.0 || ^18.0.0, react-is@npm:^18.0.0": version: 18.2.0 resolution: "react-is@npm:18.2.0" @@ -27098,13 +25953,6 @@ __metadata: languageName: node linkType: hard -"react-refresh@npm:^0.11.0": - version: 0.11.0 - resolution: "react-refresh@npm:0.11.0" - checksum: 112178a05b1e0ffeaf5d9fb4e56b4410a34a73adeb04dbf13abdc50d9ac9df2ada83e81485156cca0b3fa296aa3612751b3d6cd13be4464642a43679b819cbc7 - languageName: node - linkType: hard - "react-refresh@npm:^0.14.0": version: 0.14.0 resolution: "react-refresh@npm:0.14.0" @@ -27126,41 +25974,6 @@ __metadata: languageName: node linkType: hard -"react-remove-scroll-bar@npm:^2.3.3": - version: 2.3.4 - resolution: "react-remove-scroll-bar@npm:2.3.4" - dependencies: - react-style-singleton: ^2.2.1 - tslib: ^2.0.0 - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: b5ce5f2f98d65c97a3e975823ae4043a4ba2a3b63b5ba284b887e7853f051b5cd6afb74abde6d57b421931c52f2e1fdbb625dc858b1cb5a32c27c14ab85649d4 - languageName: node - linkType: hard - -"react-remove-scroll@npm:2.5.5": - version: 2.5.5 - resolution: "react-remove-scroll@npm:2.5.5" - dependencies: - react-remove-scroll-bar: ^2.3.3 - react-style-singleton: ^2.2.1 - tslib: ^2.1.0 - use-callback-ref: ^1.3.0 - use-sidecar: ^1.1.2 - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 2c7fe9cbd766f5e54beb4bec2e2efb2de3583037b23fef8fa511ab426ed7f1ae992382db5acd8ab5bfb030a4b93a06a2ebca41377d6eeaf0e6791bb0a59616a4 - languageName: node - linkType: hard - "react-resizable-panels@npm:^2.0.20": version: 2.0.20 resolution: "react-resizable-panels@npm:2.0.20" @@ -27183,23 +25996,6 @@ __metadata: languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1": - version: 2.2.1 - resolution: "react-style-singleton@npm:2.2.1" - dependencies: - get-nonce: ^1.0.0 - invariant: ^2.2.4 - tslib: ^2.0.0 - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 7ee8ef3aab74c7ae1d70ff34a27643d11ba1a8d62d072c767827d9ff9a520905223e567002e0bf6c772929d8ea1c781a3ba0cc4a563e92b1e3dc2eaa817ecbe8 - languageName: node - linkType: hard - "react-syntax-highlighter@npm:^15.5.0": version: 15.5.0 resolution: "react-syntax-highlighter@npm:15.5.0" @@ -27215,22 +26011,26 @@ __metadata: languageName: node linkType: hard -"react@npm:18.2.0, react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" +"react-syntax-highlighter@npm:^15.6.1": + version: 15.6.1 + resolution: "react-syntax-highlighter@npm:15.6.1" dependencies: - loose-envify: ^1.1.0 - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + "@babel/runtime": ^7.3.1 + highlight.js: ^10.4.1 + highlightjs-vue: ^1.0.0 + lowlight: ^1.17.0 + prismjs: ^1.27.0 + refractor: ^3.6.0 + peerDependencies: + react: ">= 0.14.0" + checksum: 417b6f1f2e0c1e00dcc12d34da457b94c7419345306a951d0a8d2d031a0c964179d6b700137870ad1397572cbc3a4454e94de7bbef914a81674edae2098f02dc languageName: node linkType: hard -"react@npm:^17.0.2": - version: 17.0.2 - resolution: "react@npm:17.0.2" - dependencies: - loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: b254cc17ce3011788330f7bbf383ab653c6848902d7936a87b09d835d091e3f295f7e9dd1597c6daac5dc80f90e778c8230218ba8ad599f74adcc11e33b9d61b +"react@npm:^19.0.0": + version: 19.2.5 + resolution: "react@npm:19.2.5" + checksum: 95563d3ceba2b6bf18bc4bb1e515a4fd49645630f8a017eb139fa37425f673ded545a9b6d1039021cc8a545b2a697ccfa03ac37b20c3dfa60c079f67bdabbedb languageName: node linkType: hard @@ -27456,16 +26256,16 @@ __metadata: languageName: node linkType: hard -"recast@npm:^0.23.1": - version: 0.23.4 - resolution: "recast@npm:0.23.4" +"recast@npm:^0.23.5": + version: 0.23.11 + resolution: "recast@npm:0.23.11" dependencies: - assert: ^2.0.0 ast-types: ^0.16.1 esprima: ~4.0.0 source-map: ~0.6.1 + tiny-invariant: ^1.3.3 tslib: ^2.0.1 - checksum: edb63bbe0457e68c0f4892f55413000e92aa7c5c53f9e109ab975d1c801cd299a62511ea72734435791f4aea6f0edf560f6a275761f66b2b6069ff6d72686029 + checksum: 1807159b1c33bc4a2d146e4ffea13b658e54bdcfab04fc4f9c9d7f1b4626c931e2ce41323e214516ec1e02a119037d686d825fc62f28072db27962b85e5b481d languageName: node linkType: hard @@ -27567,13 +26367,6 @@ __metadata: languageName: node linkType: hard -"regex-parser@npm:^2.2.11": - version: 2.2.11 - resolution: "regex-parser@npm:2.2.11" - checksum: 78200331ec0cc372302d287a4946c38681eb5fe435453fca572cb53cac0ba579e5eb3b9e25eac24c0c80a555fb3ea7a637814a35da1e9bc88e8819110ae5de24 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": version: 1.5.1 resolution: "regexp.prototype.flags@npm:1.5.1" @@ -27629,30 +26422,6 @@ __metadata: languageName: node linkType: hard -"remark-external-links@npm:^8.0.0": - version: 8.0.0 - resolution: "remark-external-links@npm:8.0.0" - dependencies: - extend: ^3.0.0 - is-absolute-url: ^3.0.0 - mdast-util-definitions: ^4.0.0 - space-separated-tokens: ^1.0.0 - unist-util-visit: ^2.0.0 - checksum: 48c4a41fe38916f79febb390b0c4deefe82b554dd36dc534262d851860d17fb6d15d78d515f29194e5fa48db5f01f4405a6f6dd077aaf32812a2efffb01700d7 - languageName: node - linkType: hard - -"remark-slug@npm:^6.0.0": - version: 6.1.0 - resolution: "remark-slug@npm:6.1.0" - dependencies: - github-slugger: ^1.0.0 - mdast-util-to-string: ^1.0.0 - unist-util-visit: ^2.0.0 - checksum: 81fff0dcfaf6d6117ef1293bb1d26c3e25483d99c65c22434298eed93583a89ea5d7b94063d9a7f47c0647a708ce84f00ff62d274503f248feec03c344cabb20 - languageName: node - linkType: hard - "remove-trailing-separator@npm:^1.0.1": version: 1.1.0 resolution: "remove-trailing-separator@npm:1.1.0" @@ -27784,19 +26553,6 @@ __metadata: languageName: node linkType: hard -"resolve-url-loader@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-url-loader@npm:5.0.0" - dependencies: - adjust-sourcemap-loader: ^4.0.0 - convert-source-map: ^1.7.0 - loader-utils: ^2.0.0 - postcss: ^8.2.14 - source-map: 0.6.1 - checksum: 6d483733a4c26f75ce930a61943113bf730b5ba33a7186791cf1ae9c2ca02c3e94610bc6484ca008a372ee9e31750eccea74856a89daf1a29b8437ff564d27f2 - languageName: node - linkType: hard - "resolve-url@npm:^0.2.1": version: 0.2.1 resolution: "resolve-url@npm:0.2.1" @@ -27824,6 +26580,20 @@ __metadata: languageName: node linkType: hard +"resolve@npm:^1.22.8": + version: 1.22.12 + resolution: "resolve@npm:1.22.12" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 4dc5a614b32142ef9ab455b242ed33c472c4ea50df17dbe1e9dac5fe0eebd7d5fdb7cb9cc8ad2165e5e0f07694498a74e7fbd6cc1599e20d84682cce1b80a4dc + languageName: node + linkType: hard + "resolve@npm:^2.0.0-next.4, resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" @@ -27850,12 +26620,26 @@ __metadata: version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.13.0 + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.22.8#~builtin": + version: 1.22.12 + resolution: "resolve@patch:resolve@npm%3A1.22.12#~builtin::version=1.22.12&hash=c3c19d" + dependencies: + es-errors: ^1.3.0 + is-core-module: ^2.16.1 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + checksum: 0cc5b060cbe081c85c331ac2eb08e8a54f0a195b899d5001822e5d3e2b335da651b1eed3d259fea904c22a0da9324a061e0e7ceab5dbeb5bcab5250b625754e1 languageName: node linkType: hard @@ -27901,6 +26685,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:^0.2.0": + version: 0.2.2 + resolution: "ret@npm:0.2.2" + checksum: 774964bb413a3525e687bca92d81c1cd75555ec33147c32ecca22f3d06409e35df87952cfe3d57afff7650a0f7e42139cf60cb44e94c29dde390243bc1941f16 + languageName: node + linkType: hard + "ret@npm:~0.1.10": version: 0.1.15 resolution: "ret@npm:0.1.15" @@ -27929,7 +26720,7 @@ __metadata: languageName: node linkType: hard -"rimraf@npm:^2.5.4, rimraf@npm:^2.6.1, rimraf@npm:^2.6.2, rimraf@npm:^2.6.3": +"rimraf@npm:^2.5.4, rimraf@npm:^2.6.2, rimraf@npm:^2.6.3": version: 2.7.1 resolution: "rimraf@npm:2.7.1" dependencies: @@ -28368,30 +27159,6 @@ __metadata: languageName: node linkType: hard -"sass-loader@npm:^13.2.2": - version: 13.3.2 - resolution: "sass-loader@npm:13.3.2" - dependencies: - neo-async: ^2.6.2 - peerDependencies: - fibers: ">= 3.1.0" - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: "*" - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - checksum: 7394a8d1b818a289b9caabd979543c907b83e28ae08bc80ccb836e0ccabc4ae574c077ab2fa520ba5fb8abb2ec3e7c9822a1cbd8c58a28ff30018be9d1dc6c27 - languageName: node - linkType: hard - "sass@npm:^1.66.1": version: 1.69.5 resolution: "sass@npm:1.69.5" @@ -28430,16 +27197,6 @@ __metadata: languageName: node linkType: hard -"scheduler@npm:^0.20.2": - version: 0.20.2 - resolution: "scheduler@npm:0.20.2" - dependencies: - loose-envify: ^1.1.0 - object-assign: ^4.1.1 - checksum: c4b35cf967c8f0d3e65753252d0f260271f81a81e427241295c5a7b783abf4ea9e905f22f815ab66676f5313be0a25f47be582254db8f9241b259213e999b8fc - languageName: node - linkType: hard - "scheduler@npm:^0.23.0": version: 0.23.0 resolution: "scheduler@npm:0.23.0" @@ -28449,6 +27206,13 @@ __metadata: languageName: node linkType: hard +"scheduler@npm:^0.27.0": + version: 0.27.0 + resolution: "scheduler@npm:0.27.0" + checksum: 92644ead0a9443e20f9d24132fe93675b156209b9eeb35ea245f8a86768d0cc0fcca56f341eeef21d9b6dd8e72d6d5e260eb5a41d34b05cd605dd45a29f572ef + languageName: node + linkType: hard + "schema-utils@npm:2.7.0": version: 2.7.0 resolution: "schema-utils@npm:2.7.0" @@ -28482,7 +27246,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -28565,6 +27329,24 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.8.0 + resolution: "semver@npm:7.8.0" + bin: + semver: bin/semver.js + checksum: 68e38bc26ed1191d7c78d2b711bdffc2f8b1d05a1caadda41a1d7e1a9d32e1da5ae5b645de5c5f2b27bde830d7e9c1cbeeafcb8fda091830411df7d40be405b1 + languageName: node + linkType: hard + +"semver@npm:^7.6.2": + version: 7.7.4 + resolution: "semver@npm:7.7.4" + bin: + semver: bin/semver.js + checksum: 9b4a6a58e98b9723fafcafa393c9d4e8edefaa60b8dfbe39e30892a3604cf1f45f52df9cfb1ae1a22b44c8b3d57fec8a9bb7b3e1645431587cb272399ede152e + languageName: node + linkType: hard + "send@npm:0.18.0, send@npm:^0.18.0, send@npm:latest": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -28875,15 +27657,6 @@ __metadata: languageName: node linkType: hard -"simple-update-notifier@npm:^2.0.0": - version: 2.0.0 - resolution: "simple-update-notifier@npm:2.0.0" - dependencies: - semver: ^7.5.3 - checksum: 9ba00d38ce6a29682f64a46213834e4eb01634c2f52c813a9a7b8873ca49cdbb703696f3290f3b27dc067de6d9418b0b84bef22c3eb074acf352529b2d6c27fd - languageName: node - linkType: hard - "sisteransi@npm:^1.0.5": version: 1.0.5 resolution: "sisteransi@npm:1.0.5" @@ -29106,13 +27879,6 @@ __metadata: languageName: node linkType: hard -"source-map@npm:0.6.1, source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - "source-map@npm:^0.5.6, source-map@npm:^0.5.7": version: 0.5.7 resolution: "source-map@npm:0.5.7" @@ -29120,6 +27886,13 @@ __metadata: languageName: node linkType: hard +"source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.0, source-map@npm:~0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + "source-map@npm:^0.7.3": version: 0.7.4 resolution: "source-map@npm:0.7.4" @@ -29201,6 +27974,20 @@ __metadata: languageName: node linkType: hard +"split-on-first@npm:^1.0.0": + version: 1.1.0 + resolution: "split-on-first@npm:1.1.0" + checksum: 16ff85b54ddcf17f9147210a4022529b343edbcbea4ce977c8f30e38408b8d6e0f25f92cd35b86a524d4797f455e29ab89eb8db787f3c10708e0b47ebf528d30 + languageName: node + linkType: hard + +"split-on-first@npm:^3.0.0": + version: 3.0.0 + resolution: "split-on-first@npm:3.0.0" + checksum: 75dc27ecbac65cfbeab9a3b90cf046307220192d3d7a30e46aa0f19571cc9b4802aac813f3de2cc9b16f2e46aae72f275659b5d2614bb5369c77724d739e5f73 + languageName: node + linkType: hard + "split-string@npm:^3.0.1, split-string@npm:^3.0.2": version: 3.1.0 resolution: "split-string@npm:3.1.0" @@ -29359,22 +28146,28 @@ __metadata: languageName: node linkType: hard -"store2@npm:^2.12.0, store2@npm:^2.14.2": +"store2@npm:^2.12.0": version: 2.14.2 resolution: "store2@npm:2.14.2" checksum: 6f270fc5bab99b63f45fcc7bd8b99c2714b4adf880f557ed7ffb5ed3987131251165bccde425a00928aaf044870aee79ddeef548576d093c68703ed2edec45d7 languageName: node linkType: hard -"storybook@npm:^7.0.26": - version: 7.5.3 - resolution: "storybook@npm:7.5.3" +"storybook@npm:^8.6.18": + version: 8.6.18 + resolution: "storybook@npm:8.6.18" dependencies: - "@storybook/cli": 7.5.3 + "@storybook/core": 8.6.18 + peerDependencies: + prettier: ^2 || ^3 + peerDependenciesMeta: + prettier: + optional: true bin: - sb: ./index.js - storybook: ./index.js - checksum: d5263aa78fd8f295d2770911b78cc13c00bf5ac3b67c017b9c7d388de915efd41c2091dc808122649c22c0904afb8e593ed5521d7086aea8cd12596d6df95a4b + getstorybook: ./bin/index.cjs + sb: ./bin/index.cjs + storybook: ./bin/index.cjs + checksum: a372b3d86ffa3657f311cbc1accc85dda998b5ef4ca8d18f9027261e87e000fb978455a7d9e476dc82b6504a38afd0351b1714e0a875196dc183a9a0ac0827a8 languageName: node linkType: hard @@ -29443,6 +28236,13 @@ __metadata: languageName: node linkType: hard +"strict-uri-encode@npm:^2.0.0": + version: 2.0.0 + resolution: "strict-uri-encode@npm:2.0.0" + checksum: eaac4cf978b6fbd480f1092cab8b233c9b949bcabfc9b598dd79a758f7243c28765ef7639c876fa72940dac687181b35486ea01ff7df3e65ce3848c64822c581 + languageName: node + linkType: hard + "string-argv@npm:^0.3.1": version: 0.3.2 resolution: "string-argv@npm:0.3.2" @@ -29760,7 +28560,14 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.0.1, strip-json-comments@npm:^3.1.1": +"strip-indent@npm:^4.0.0": + version: 4.1.1 + resolution: "strip-indent@npm:4.1.1" + checksum: d322bfdc59855006791a4aebe2a66e0892eab7004a5c064d74b86a0c6ecff2818974c9a5eda54b16d8af6aadbc90a6c02635ffcbec11ab33dd8979b1a6346fc0 + languageName: node + linkType: hard + +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -29808,7 +28615,7 @@ __metadata: languageName: node linkType: hard -"style-loader@npm:^3.3.1, style-loader@npm:^3.3.2": +"style-loader@npm:^3.3.1": version: 3.3.3 resolution: "style-loader@npm:3.3.3" peerDependencies: @@ -29957,16 +28764,6 @@ __metadata: languageName: node linkType: hard -"swc-loader@npm:^0.2.3": - version: 0.2.3 - resolution: "swc-loader@npm:0.2.3" - peerDependencies: - "@swc/core": ^1.2.147 - webpack: ">=2" - checksum: 010d84d399525c0185d36d62c86c55ae017e7a90046bc8a39be4b7e07526924037868049f6037bc966da98151cb2600934b96a66279b742d3c413a718b427251 - languageName: node - linkType: hard - "swiper@npm:^11.1.0": version: 11.1.0 resolution: "swiper@npm:11.1.0" @@ -30021,19 +28818,7 @@ __metadata: languageName: node linkType: hard -"tar-fs@npm:^2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-stream@npm:^2.1.4, tar-stream@npm:~2.2.0": +"tar-stream@npm:~2.2.0": version: 2.2.0 resolution: "tar-stream@npm:2.2.0" dependencies: @@ -30060,7 +28845,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2, tar@npm:^6.2.0": +"tar@npm:^6.0.2, tar@npm:^6.0.5, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" dependencies: @@ -30090,15 +28875,6 @@ __metadata: languageName: node linkType: hard -"telejson@npm:^7.2.0": - version: 7.2.0 - resolution: "telejson@npm:7.2.0" - dependencies: - memoizerific: ^1.11.3 - checksum: 55a3380c9ff3c5ad84581bb6bda28fc33c6b7c4a0c466894637da687639b8db0d21b0ff4c1bc1a7a92ae6b70662549d09e7b9e8b1ec334b2ef93078762ecdfb9 - languageName: node - linkType: hard - "temp-dir@npm:1.0.0, temp-dir@npm:^1.0.0": version: 1.0.0 resolution: "temp-dir@npm:1.0.0" @@ -30181,19 +28957,6 @@ __metadata: languageName: node linkType: hard -"tempy@npm:^1.0.1": - version: 1.0.1 - resolution: "tempy@npm:1.0.1" - dependencies: - del: ^6.0.0 - is-stream: ^2.0.0 - temp-dir: ^2.0.0 - type-fest: ^0.16.0 - unique-string: ^2.0.0 - checksum: e77ca4440af18e42dc64d8903b7ed0be673455b76680ff94a7d7c6ee7c16f7604bdcdee3c39436342b1082c23eda010dbe48f6094e836e0bd53c8b1aa63e5b95 - languageName: node - linkType: hard - "term-size@npm:^2.1.0, term-size@npm:^2.2.1": version: 2.2.1 resolution: "term-size@npm:2.2.1" @@ -30336,7 +29099,7 @@ __metadata: languageName: node linkType: hard -"through2@npm:^2.0.0, through2@npm:^2.0.1, through2@npm:^2.0.3": +"through2@npm:^2.0.0, through2@npm:^2.0.1": version: 2.0.5 resolution: "through2@npm:2.0.5" dependencies: @@ -30378,13 +29141,6 @@ __metadata: languageName: node linkType: hard -"tiny-events@npm:^1.0.1": - version: 1.0.1 - resolution: "tiny-events@npm:1.0.1" - checksum: c1e374ee9fae6a5690c97a5a1d4edd527c5ba17e24738b97a796df189c1bd821bfbc083162b38e8b1be67ff7eb480694e44edec246f2eae5ebd61f25471f0acb - languageName: node - linkType: hard - "tiny-invariant@npm:^1.3.1": version: 1.3.1 resolution: "tiny-invariant@npm:1.3.1" @@ -30392,6 +29148,13 @@ __metadata: languageName: node linkType: hard +"tiny-invariant@npm:^1.3.3": + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe + languageName: node + linkType: hard + "tinycolor2@npm:^1.4.1": version: 1.6.0 resolution: "tinycolor2@npm:1.6.0" @@ -30399,6 +29162,20 @@ __metadata: languageName: node linkType: hard +"tinyrainbow@npm:^1.2.0": + version: 1.2.0 + resolution: "tinyrainbow@npm:1.2.0" + checksum: d1e2cb5400032c0092be00e4a3da5450bea8b4fad58bfb5d3c58ca37ff5c5e252f7fcfb9af247914854af79c46014add9d1042fe044358c305a129ed55c8be35 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.0": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 + languageName: node + linkType: hard + "tldts-core@npm:^5.7.112": version: 5.7.112 resolution: "tldts-core@npm:5.7.112" @@ -30406,6 +29183,13 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^6.1.86": + version: 6.1.86 + resolution: "tldts-core@npm:6.1.86" + checksum: 0a715457e03101deff9b34cf45dcd91b81985ef32d35b8e9c4764dcf76369bf75394304997584080bb7b8897e94e20f35f3e8240a1ec87d6faba3cc34dc5a954 + languageName: node + linkType: hard + "tldts@npm:~5.7.112": version: 5.7.112 resolution: "tldts@npm:5.7.112" @@ -30417,6 +29201,17 @@ __metadata: languageName: node linkType: hard +"tldts@npm:~6.1.86": + version: 6.1.86 + resolution: "tldts@npm:6.1.86" + dependencies: + tldts-core: ^6.1.86 + bin: + tldts: bin/cli.js + checksum: e5c57664f73663c6c8f7770db02c0c03d6f877fe837854c72037be8092826f95b8e568962358441ef18431b80b7e40ed88391c70873ee7ec0d4344999a12e3de + languageName: node + linkType: hard + "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -30496,13 +29291,6 @@ __metadata: languageName: node linkType: hard -"tocbot@npm:^4.20.1": - version: 4.22.0 - resolution: "tocbot@npm:4.22.0" - checksum: 55d97648b3c66c39f6587bc4ef86379f9057a532f1f194844fbc708162f2b102b6ca481307882f11c21d76440df7b0908e60034469d73bccc78860309970e146 - languageName: node - linkType: hard - "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -30612,7 +29400,7 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^4.1.2": +"tsconfig-paths@npm:^4.1.2, tsconfig-paths@npm:^4.2.0": version: 4.2.0 resolution: "tsconfig-paths@npm:4.2.0" dependencies: @@ -30623,7 +29411,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^1.13.0, tslib@npm:^1.8.0, tslib@npm:^1.8.1": +"tslib@npm:^1.8.0, tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd @@ -30812,13 +29600,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^2.19.0, type-fest@npm:~2.19": - version: 2.19.0 - resolution: "type-fest@npm:2.19.0" - checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 - languageName: node - linkType: hard - "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -31024,6 +29805,44 @@ __metadata: languageName: node linkType: hard +"typia@npm:9.7.2": + version: 9.7.2 + resolution: "typia@npm:9.7.2" + dependencies: + "@samchon/openapi": ^4.7.1 + "@standard-schema/spec": ^1.0.0 + commander: ^10.0.0 + comment-json: ^4.2.3 + inquirer: ^8.2.5 + package-manager-detector: ^0.2.0 + randexp: ^0.5.3 + peerDependencies: + typescript: ">=4.8.0 <5.10.0" + bin: + typia: lib/executable/typia.js + checksum: e3b3374702bf1e12b548bb46d7cb8a9ad9d3a0fbee9d15d1cda286f28a43504d83c2da5f097d5509ff4a138e13048108c60c2460616e42226405e65b77f5b7da + languageName: node + linkType: hard + +"typia@patch:typia@npm%3A9.7.2#./.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch::locator=embeddedchat%40workspace%3A.": + version: 9.7.2 + resolution: "typia@patch:typia@npm%3A9.7.2#./.yarn/patches/typia-npm-9.7.2-5c5d9c80b4.patch::version=9.7.2&hash=cc0415&locator=embeddedchat%40workspace%3A." + dependencies: + "@samchon/openapi": ^4.7.1 + "@standard-schema/spec": ^1.0.0 + commander: ^10.0.0 + comment-json: ^4.2.3 + inquirer: ^8.2.5 + package-manager-detector: ^0.2.0 + randexp: ^0.5.3 + peerDependencies: + typescript: ">=4.8.0 <5.10.0" + bin: + typia: lib/executable/typia.js + checksum: 240a163efef623f88892b2d275082ae7339543a3ac623641b448087d07cf49f59047336eb9a72ddcbff63f208a0e9c6271d8a24e1a1b030bebfd98973782d68c + languageName: node + linkType: hard + "ua-parser-js@npm:^1.0.35": version: 1.0.37 resolution: "ua-parser-js@npm:1.0.37" @@ -31052,13 +29871,6 @@ __metadata: languageName: node linkType: hard -"ultron@npm:~1.1.0": - version: 1.1.1 - resolution: "ultron@npm:1.1.1" - checksum: aa7b5ebb1b6e33287b9d873c6756c4b7aa6d1b23d7162ff25b0c0ce5c3c7e26e2ab141a5dc6e96c10ac4d00a372e682ce298d784f06ffcd520936590b4bc0653 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.0.2": version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" @@ -31200,34 +30012,6 @@ __metadata: languageName: node linkType: hard -"unist-util-is@npm:^4.0.0": - version: 4.1.0 - resolution: "unist-util-is@npm:4.1.0" - checksum: 726484cd2adc9be75a939aeedd48720f88294899c2e4a3143da413ae593f2b28037570730d5cf5fd910ff41f3bc1501e3d636b6814c478d71126581ef695f7ea - languageName: node - linkType: hard - -"unist-util-visit-parents@npm:^3.0.0": - version: 3.1.1 - resolution: "unist-util-visit-parents@npm:3.1.1" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - checksum: 1170e397dff88fab01e76d5154981666eb0291019d2462cff7a2961a3e76d3533b42eaa16b5b7e2d41ad42a5ea7d112301458283d255993e660511387bf67bc3 - languageName: node - linkType: hard - -"unist-util-visit@npm:^2.0.0": - version: 2.0.3 - resolution: "unist-util-visit@npm:2.0.3" - dependencies: - "@types/unist": ^2.0.0 - unist-util-is: ^4.0.0 - unist-util-visit-parents: ^3.0.0 - checksum: 1fe19d500e212128f96d8c3cfa3312846e586b797748a1fd195fe6479f06bc90a6f6904deb08eefc00dd58e83a1c8a32fb8677252d2273ad7a5e624525b69b8f - languageName: node - linkType: hard - "universal-user-agent@npm:^6.0.0": version: 6.0.1 resolution: "universal-user-agent@npm:6.0.1" @@ -31235,15 +30019,6 @@ __metadata: languageName: node linkType: hard -"universal-websocket-client@npm:^1.0.2": - version: 1.0.2 - resolution: "universal-websocket-client@npm:1.0.2" - dependencies: - ws: ^3.3.3 - checksum: 6235a16d227e9a5aba752ebaaefd42a18c5ad59b15d36e1e7e102360c8b41d868da76a8f9bf6741ec88e0272cb081e863e360bbf388aefcd73bfc98c52678043 - languageName: node - linkType: hard - "universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" @@ -31308,13 +30083,6 @@ __metadata: languageName: node linkType: hard -"untildify@npm:^4.0.0": - version: 4.0.0 - resolution: "untildify@npm:4.0.0" - checksum: 39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 - languageName: node - linkType: hard - "upath@npm:2.0.1, upath@npm:^2.0.1": version: 2.0.1 resolution: "upath@npm:2.0.1" @@ -31343,6 +30111,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.2.3": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.1 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 6f209a97ae8eacdd3a1ef2eb365adf49d1e2a757e5b2dd4ac87dc8c99236cbe3e572d3e605a87dd7b538a11751b71d9f93edc47c7405262a293a493d155316cd + languageName: node + linkType: hard + "uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" @@ -31395,49 +30177,6 @@ __metadata: languageName: node linkType: hard -"use-callback-ref@npm:^1.3.0": - version: 1.3.0 - resolution: "use-callback-ref@npm:1.3.0" - dependencies: - tslib: ^2.0.0 - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 7913df383a5a6fcb399212eedefaac2e0c6f843555202d4e3010bac3848afe38ecaa3d0d6500ad1d936fbeffd637e6c517e68edb024af5e6beca7f27f3ce7b21 - languageName: node - linkType: hard - -"use-resize-observer@npm:^9.1.0": - version: 9.1.0 - resolution: "use-resize-observer@npm:9.1.0" - dependencies: - "@juggle/resize-observer": ^3.3.1 - peerDependencies: - react: 16.8.0 - 18 - react-dom: 16.8.0 - 18 - checksum: 92be0ac34a3b3cf884cd55847c90792b5b44833dc258e96d650152815ad246afe45825aa223332203004d836535a927ab74f18dc0313229e2c7c69510eddf382 - languageName: node - linkType: hard - -"use-sidecar@npm:^1.1.2": - version: 1.1.2 - resolution: "use-sidecar@npm:1.1.2" - dependencies: - detect-node-es: ^1.1.0 - tslib: ^2.0.0 - peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 925d1922f9853e516eaad526b6fed1be38008073067274f0ecc3f56b17bb8ab63480140dd7c271f94150027c996cea4efe83d3e3525e8f3eda22055f6a39220b - languageName: node - linkType: hard - "use-sync-external-store@npm:1.2.0, use-sync-external-store@npm:^1.0.0, use-sync-external-store@npm:~1.2.0": version: 1.2.0 resolution: "use-sync-external-store@npm:1.2.0" @@ -31574,17 +30313,6 @@ __metadata: languageName: node linkType: hard -"v8-to-istanbul@npm:^9.0.0": - version: 9.1.3 - resolution: "v8-to-istanbul@npm:9.1.3" - dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^2.0.0 - checksum: 5d592ab3d186b386065dace8e01c543a922a904b3cfac39667de172455a6b3d0e8e1401574fecb8a12092ad0809b5a8fd15f1cc14d0666139a1bb77cd6ac2cf8 - languageName: node - linkType: hard - "valid-url@npm:^1.0.9, valid-url@npm:~1.0.9": version: 1.0.9 resolution: "valid-url@npm:1.0.9" @@ -31629,6 +30357,13 @@ __metadata: languageName: node linkType: hard +"validator@npm:^13.15.15": + version: 13.15.15 + resolution: "validator@npm:13.15.15" + checksum: 10c1b9215a25c31497c481cf4a3ee3e17dcf0b8a219445788e7167ed1b93b8597bbf657bd5c8ca22199b699c3ab41df902c23526cc514075c4b71bd19a13d02c + languageName: node + linkType: hard + "vary@npm:^1, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" @@ -31740,14 +30475,14 @@ __metadata: linkType: hard "vm2@npm:^3.9.19": - version: 3.9.19 - resolution: "vm2@npm:3.9.19" + version: 3.11.5 + resolution: "vm2@npm:3.11.5" dependencies: - acorn: ^8.7.0 - acorn-walk: ^8.2.0 + acorn: ^8.15.0 + acorn-walk: ^8.3.4 bin: vm2: bin/vm2 - checksum: fc6cf553134145cd7bb5246985bf242b056e3fb5ea71e2eef6710b2a5d6c6119cc6bc960435ff62480ee82efb43369be8f4db07b6690916ae7d3b2e714f395d8 + checksum: f45b09f28df96696bb5869b0c0e9acf0a91d9dbc27c0e64b0e500480c6de33d92d645bd5b2bc56a9466ee4b8f856d02eb45d1b165d4b957cc7e5f10d9dccdc77 languageName: node linkType: hard @@ -31776,7 +30511,7 @@ __metadata: languageName: node linkType: hard -"walker@npm:^1.0.7, walker@npm:^1.0.8": +"walker@npm:^1.0.7": version: 1.0.8 resolution: "walker@npm:1.0.8" dependencies: @@ -31811,7 +30546,7 @@ __metadata: languageName: node linkType: hard -"watchpack@npm:^2.2.0, watchpack@npm:^2.4.0": +"watchpack@npm:^2.4.0": version: 2.4.0 resolution: "watchpack@npm:2.4.0" dependencies: @@ -31865,9 +30600,9 @@ __metadata: languageName: node linkType: hard -"webpack-dev-middleware@npm:^6.1.1": - version: 6.1.1 - resolution: "webpack-dev-middleware@npm:6.1.1" +"webpack-dev-middleware@npm:^6.1.2": + version: 6.1.3 + resolution: "webpack-dev-middleware@npm:6.1.3" dependencies: colorette: ^2.0.10 memfs: ^3.4.12 @@ -31879,7 +30614,7 @@ __metadata: peerDependenciesMeta: webpack: optional: true - checksum: 3bced6ef644b20f2e76df9db1c5209f4a73761d7d307fe29ae20bc00397d4f9727af2607f98794c6c7c57d5c1a48bfa12690168b08f5d46820b07aab2c63640c + checksum: ddedaa913cc39d7ac7f971d902f181ecc5c4ab0b91f9eda5923f0ea513ecf458f71046f2ed423cb4fc657c2177fe279186453e395bd1051f0949e265c3124665 languageName: node linkType: hard @@ -31911,13 +30646,6 @@ __metadata: languageName: node linkType: hard -"webpack-virtual-modules@npm:^0.5.0": - version: 0.5.0 - resolution: "webpack-virtual-modules@npm:0.5.0" - checksum: 22b59257b55c89d11ae295b588b683ee9fdf3aeb591bc7b6f88ac1d69cb63f4fcb507666ea986866dfae161a1fa534ad6fb4e2ea91bbcd0a6d454368d7d4c64b - languageName: node - linkType: hard - "webpack-virtual-modules@npm:^0.6.0": version: 0.6.0 resolution: "webpack-virtual-modules@npm:0.6.0" @@ -32507,16 +31235,6 @@ __metadata: languageName: node linkType: hard -"write-file-atomic@npm:^4.0.2": - version: 4.0.2 - resolution: "write-file-atomic@npm:4.0.2" - dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 5da60bd4eeeb935eec97ead3df6e28e5917a6bd317478e4a85a5285e8480b8ed96032bbcc6ecd07b236142a24f3ca871c924ec4a6575e623ec1b11bf8c1c253c - languageName: node - linkType: hard - "write-file-atomic@npm:^5.0.0": version: 5.0.1 resolution: "write-file-atomic@npm:5.0.1" @@ -32552,18 +31270,7 @@ __metadata: languageName: node linkType: hard -"ws@npm:^3.3.3": - version: 3.3.3 - resolution: "ws@npm:3.3.3" - dependencies: - async-limiter: ~1.0.0 - safe-buffer: ~5.1.0 - ultron: ~1.1.0 - checksum: 20b7bf34bb88715b9e2d435b76088d770e063641e7ee697b07543815fabdb752335261c507a973955e823229d0af8549f39cc669825e5c8404aa0422615c81d9 - languageName: node - linkType: hard - -"ws@npm:^6.1.0, ws@npm:^6.2.2": +"ws@npm:^6.2.2": version: 6.2.2 resolution: "ws@npm:6.2.2" dependencies: @@ -32730,7 +31437,7 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 @@ -32786,16 +31493,6 @@ __metadata: languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b - languageName: node - linkType: hard - "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" @@ -32804,9 +31501,16 @@ __metadata: linkType: hard "yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 92dd9880c324dbc94ff4b677b7d350ba8d835619062b7102f577add7a59ab4d87f40edc5a03d77d369dfa9d11175b1b2ec4a06a6f8a5d8ce5d1306713f66ee41 + languageName: node + linkType: hard + +"zod@npm:~4.3.6": + version: 4.3.6 + resolution: "zod@npm:4.3.6" + checksum: 19cec761b46bae4b6e7e861ea740f3f248e50a6671825afc8a5758e27b35d6f20ccde9942422fd5cf6f8b697f18bd05ef8bb33f5f2db112ab25cc628de2fae47 languageName: node linkType: hard