diff --git a/.github/actions/webapp-setup/action.yml b/.github/actions/webapp-setup/action.yml index af97cb31c72..74313c5f124 100644 --- a/.github/actions/webapp-setup/action.yml +++ b/.github/actions/webapp-setup/action.yml @@ -17,17 +17,9 @@ runs: webapp/channels/node_modules webapp/platform/client/node_modules webapp/platform/components/node_modules + webapp/platform/shared/node_modules webapp/platform/types/node_modules key: node-modules-${{ runner.os }}-${{ hashFiles('webapp/package-lock.json') }} - - name: ci/cache-platform-builds - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 - id: cache-platform-builds - with: - path: | - webapp/platform/types/lib - webapp/platform/client/lib - webapp/platform/components/dist - key: platform-builds-${{ runner.os }}-${{ hashFiles('webapp/platform/types/src/**', 'webapp/platform/client/src/**', 'webapp/platform/components/src/**') }} - name: ci/get-node-modules if: steps.cache-node-modules.outputs.cache-hit != 'true' shell: bash @@ -35,8 +27,10 @@ runs: run: | make node_modules - name: ci/build-platform-packages - if: steps.cache-platform-builds.outputs.cache-hit != 'true' + # These are built automatically when depenedencies are installed, but they aren't cached properly, so we need to + # manually build them when the cache is hit. They aren't worth caching because they have too many dependencies. + if: steps.cache-node-modules.outputs.cache-hit == 'true' shell: bash working-directory: webapp run: | - npm run build --workspace=platform/types --workspace=platform/client --workspace=platform/components + npm run postinstall diff --git a/.github/workflows/webapp-ci.yml b/.github/workflows/webapp-ci.yml index 34804e96251..65b7633a756 100644 --- a/.github/workflows/webapp-ci.yml +++ b/.github/workflows/webapp-ci.yml @@ -80,7 +80,7 @@ jobs: env: NODE_OPTIONS: --max_old_space_size=5120 run: | - npm run test-ci --workspace=platform/client --workspace=platform/components -- --coverage + npm run test-ci --workspace=platform/client --workspace=platform/components --workspace=platform/shared -- --coverage - name: ci/upload-coverage-artifact uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: @@ -88,6 +88,7 @@ jobs: path: | ./webapp/platform/client/coverage ./webapp/platform/components/coverage + ./webapp/platform/shared/coverage retention-days: 1 test-mattermost-redux: diff --git a/webapp/.gitignore b/webapp/.gitignore index 60d73c30a9f..ab63914836c 100644 --- a/webapp/.gitignore +++ b/webapp/.gitignore @@ -1,6 +1,7 @@ .eslintcache junit.xml node_modules +.parcel-cache *.tsbuildinfo .rollup.cache *.tar.gz diff --git a/webapp/Makefile b/webapp/Makefile index f2ae6d22ae9..09fa4872299 100644 --- a/webapp/Makefile +++ b/webapp/Makefile @@ -97,8 +97,7 @@ endif clean: ## Clears cached; deletes node_modules and dist directories @echo Cleaning Web App - npm run clean --workspaces --if-present - rm -rf node_modules + npm run clean .PHONY: package package: node_modules dist ## Generates ./mattermost-webapp.tar.gz for use by someone customizing the web app diff --git a/webapp/channels/package.json b/webapp/channels/package.json index 941bc3caf70..fb3030b5bac 100644 --- a/webapp/channels/package.json +++ b/webapp/channels/package.json @@ -12,6 +12,7 @@ "@guyplusplus/turndown-plugin-gfm": "1.0.7", "@mattermost/client": "11.4.0", "@mattermost/desktop-api": "6.0.0-1", + "@mattermost/shared": "11.4.0", "@mattermost/types": "11.4.0", "@mui/base": "5.0.0-alpha.127", "@mui/material": "5.11.16", diff --git a/webapp/channels/src/components/emoji/render_emoji.tsx b/webapp/channels/src/components/emoji/render_emoji.tsx index ae900c9946c..ee67d2e5f5f 100644 --- a/webapp/channels/src/components/emoji/render_emoji.tsx +++ b/webapp/channels/src/components/emoji/render_emoji.tsx @@ -1,63 +1,6 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; -import type {MouseEvent, KeyboardEvent} from 'react'; -import {useSelector} from 'react-redux'; +import {Emoji} from '@mattermost/shared/components/emoji'; -import {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils'; - -import {getEmojiMap} from 'selectors/emojis'; - -import type {GlobalState} from 'types/store'; - -const emptyEmojiStyle = {}; - -interface ComponentProps { - emojiName: string; - size?: number; - emojiStyle?: React.CSSProperties; - onClick?: (event: MouseEvent | KeyboardEvent) => void; -} - -const RenderEmoji = ({ - emojiName = '', - emojiStyle = emptyEmojiStyle, - size = 16, - onClick, -}: ComponentProps) => { - const emojiMap = useSelector((state: GlobalState) => getEmojiMap(state)); - - if (!emojiName) { - return null; - } - - const emojiFromMap = emojiMap.get(emojiName); - if (!emojiFromMap) { - return null; - } - const emojiImageUrl = getEmojiImageUrl(emojiFromMap); - - return ( - - ); -}; - -export default React.memo(RenderEmoji); +export default Emoji; diff --git a/webapp/channels/src/components/root/root_provider.tsx b/webapp/channels/src/components/root/root_provider.tsx index b58424eecd6..6c00913d3b8 100644 --- a/webapp/channels/src/components/root/root_provider.tsx +++ b/webapp/channels/src/components/root/root_provider.tsx @@ -9,18 +9,22 @@ import ThemeProvider from 'components/theme_provider'; import WebSocketClient from 'client/web_websocket_client'; import {WebSocketContext} from 'utils/use_websocket'; +import SharedPackageProvider from './shared_package_provider'; + type Props = { children: React.ReactNode; } export default function RootProvider(props: Props) { return ( - - - - {props.children} - - - + + + + + {props.children} + + + + ); } diff --git a/webapp/channels/src/components/root/shared_package_provider.tsx b/webapp/channels/src/components/root/shared_package_provider.tsx new file mode 100644 index 00000000000..becc0e9fb4f --- /dev/null +++ b/webapp/channels/src/components/root/shared_package_provider.tsx @@ -0,0 +1,48 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; +import {useSelector} from 'react-redux'; + +import {SharedProvider} from '@mattermost/shared/context'; +import type {Emoji} from '@mattermost/types/emojis'; + +import {getEmojiImageUrl} from 'mattermost-redux/utils/emoji_utils'; + +import {getEmojiMap} from 'selectors/emojis'; + +import type {GlobalState} from 'types/store'; + +export interface SharedPackageProviderProps { + children: React.ReactNode; +} + +export default function SharedPackageProvider({children}: SharedPackageProviderProps) { + return ( + + {children} + + ); +} + +function useEmojiByName(name: string) { + // This isn't defined for use elsewhere because makeUseEntity currently needs additional logic for handling emojis + const emojiMap = useSelector((state: GlobalState) => getEmojiMap(state)); + + if (!name) { + return undefined; + } + + return emojiMap.get(name); +} + +function useEmojiUrl(emoji?: Emoji) { + if (!emoji) { + return ''; + } + + return getEmojiImageUrl(emoji); +} diff --git a/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.test.ts b/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.test.ts index e333ac68c22..c31c9d99994 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.test.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.test.ts @@ -52,8 +52,6 @@ describe('EmojiUtils', () => { category: 'activities', short_names: ['sampleEmoji'], short_name: 'sampleEmoji', - batch: 2, - image: 'sampleEmoji.png', }); expect(EmojiUtils.isSystemEmoji(sampleEmoji)).toBe(true); }); @@ -64,8 +62,6 @@ describe('EmojiUtils', () => { name: 'sampleEmoji', short_names: ['sampleEmoji'], short_name: 'sampleEmoji', - batch: 2, - image: 'sampleEmoji.png', }); expect(EmojiUtils.isSystemEmoji(sampleEmoji)).toBe(true); }); diff --git a/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.ts b/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.ts index 25d1c87c511..65f9e88c179 100644 --- a/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.ts +++ b/webapp/channels/src/packages/mattermost-redux/src/utils/emoji_utils.ts @@ -1,17 +1,11 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import type {Emoji, SystemEmoji} from '@mattermost/types/emojis'; +import {isSystemEmoji, type Emoji} from '@mattermost/types/emojis'; import {Client4} from 'mattermost-redux/client'; -export function isSystemEmoji(emoji: Emoji): emoji is SystemEmoji { - if ('category' in emoji) { - return emoji.category !== 'custom'; - } - - return !('id' in emoji); -} +export {isSystemEmoji}; export function getEmojiImageUrl(emoji: Emoji): string { // If its the mattermost custom emoji diff --git a/webapp/channels/src/packages/mattermost-redux/test/test_helper.ts b/webapp/channels/src/packages/mattermost-redux/test/test_helper.ts index b9a9ed17374..2ff3905575a 100644 --- a/webapp/channels/src/packages/mattermost-redux/test/test_helper.ts +++ b/webapp/channels/src/packages/mattermost-redux/test/test_helper.ts @@ -701,10 +701,8 @@ class TestHelper { return { name: '', category: 'recent', - image: '', short_name: '', short_names: [], - batch: 0, unified: '', ...override, }; diff --git a/webapp/channels/src/tests/react_testing_utils.tsx b/webapp/channels/src/tests/react_testing_utils.tsx index 13652b578e4..3cadb86a29c 100644 --- a/webapp/channels/src/tests/react_testing_utils.tsx +++ b/webapp/channels/src/tests/react_testing_utils.tsx @@ -16,6 +16,8 @@ import type {DeepPartial} from '@mattermost/types/utilities'; import configureStore from 'store'; import globalStore from 'stores/redux_store'; +import SharedPackageProvider from 'components/root/shared_package_provider'; + import WebSocketClient from 'client/web_websocket_client'; import mergeObjects from 'packages/mattermost-redux/test/merge_objects'; import mockStore from 'tests/test_store'; @@ -183,14 +185,16 @@ const Providers = ({children, store, history, options}: RenderStateProps) => { return ( - - - {children} - - + + + + {children} + + + ); diff --git a/webapp/channels/src/utils/test_helper.ts b/webapp/channels/src/utils/test_helper.ts index 4f3a2416949..8dacc70d202 100644 --- a/webapp/channels/src/utils/test_helper.ts +++ b/webapp/channels/src/utils/test_helper.ts @@ -452,10 +452,8 @@ export class TestHelper { return { name: '', category: 'recent', - image: '', short_name: '', short_names: [], - batch: 0, unified: '', ...override, }; diff --git a/webapp/channels/webpack.config.js b/webapp/channels/webpack.config.js index 52ce5c286bc..20f0c9f701a 100644 --- a/webapp/channels/webpack.config.js +++ b/webapp/channels/webpack.config.js @@ -302,6 +302,11 @@ var config = { ], }), ], + watchOptions: { + + // By default, Webpack doesn't watch node_modules for changes, but we want it to watch packages in the monorepo + ignored: /node_modules([\\]+|\/)(?!@mattermost\/(client|components|types|shared))/, + }, }; function generateCSP() { diff --git a/webapp/package-lock.json b/webapp/package-lock.json index a4dfee38afb..4f91749317b 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -12,6 +12,7 @@ "platform/components", "platform/eslint-plugin", "platform/mattermost-redux", + "platform/shared", "platform/types" ], "dependencies": { @@ -65,6 +66,7 @@ "@guyplusplus/turndown-plugin-gfm": "1.0.7", "@mattermost/client": "11.4.0", "@mattermost/desktop-api": "6.0.0-1", + "@mattermost/shared": "11.4.0", "@mattermost/types": "11.4.0", "@mui/base": "5.0.0-alpha.127", "@mui/material": "5.11.16", @@ -2519,29 +2521,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/js": { "version": "8.57.0", "license": "MIT", @@ -3262,6 +3241,78 @@ "node": ">=8" } }, + "node_modules/@jest/create-cache-key-function": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-30.2.0.tgz", + "integrity": "sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/create-cache-key-function/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@jest/diff-sequences": { "version": "30.0.1", "dev": true, @@ -4342,6 +4393,107 @@ "dev": true, "license": "MIT" }, + "node_modules/@lezer/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", + "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/lr": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.7.tgz", + "integrity": "sha512-wNIFWdSUfX9Jc6ePMzxSPVgTVB4EOfDIwLQLWASyiUdHKaMsiilj9bYiGkGQCKVodd0x6bgQCV207PILGFCF9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-2.8.5.tgz", + "integrity": "sha512-KPDeVScZgA1oq0CiPBcOa3kHIqU+pTOwRFDIhxvmf8CTNvqdZQYp5cCKW0bUk69VygB2PuTiINFWbY78aR2pQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-2.8.5.tgz", + "integrity": "sha512-w/sLhN4T7MW1nB3R/U8WK5BgQLz904wh+/SmA2jD8NnF7BLLoUgflCNxOeSPOWp8geP6nP/+VjWzZVip7rZ1ug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-2.8.5.tgz", + "integrity": "sha512-c0TGMbm2M55pwTDIfkDLB6BpIsgxV4PjYck2HiOX+cy/JWiBXz32lYbarPqejKs9Flm7YVAKSILUducU9g2RVg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-2.8.5.tgz", + "integrity": "sha512-vtbZRHH5UDlL01TT5jB576Zox3+hdyogvpcbvVJlmU5PdL3c5V7cj1EODdh1CHPksRl+cws/58ugEHi8bcj4Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-2.8.5.tgz", + "integrity": "sha512-Xkc8IUx9aEhP0zvgeKy7IQ3ReX2N8N1L0WPcQwnZweWmOuKfwpS3GRIYqLtK5za/w3E60zhFfNdS+3pBZPytqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-2.8.5.tgz", + "integrity": "sha512-4wvrf5BgnR8RpogHhtpCPJMKBmvyZPhhUtEwMJbXh0ni2BucpfF07jlmyM11zRqQ2XIq6PbC2j7W7UCCcm1rRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "license": "BSD-3-Clause", @@ -4394,6 +4546,10 @@ "resolved": "platform/eslint-plugin", "link": true }, + "node_modules/@mattermost/shared": { + "resolved": "platform/shared", + "link": true + }, "node_modules/@mattermost/types": { "resolved": "platform/types", "link": true @@ -4403,10 +4559,109 @@ "dev": true, "license": "CC0-1.0" }, + "node_modules/@mischnic/json-sourcemap": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@mischnic/json-sourcemap/-/json-sourcemap-0.1.1.tgz", + "integrity": "sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/lr": "^1.0.0", + "json5": "^2.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "license": "BSD-2-Clause" }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", + "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", + "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", + "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", + "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", + "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", + "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@mui/base": { "version": "5.0.0-alpha.127", "license": "MIT", @@ -4782,15 +5037,1699 @@ "node": ">= 8" } }, - "node_modules/@parcel/watcher": { - "version": "2.4.1", + "node_modules/@parcel/bundler-default": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/bundler-default/-/bundler-default-2.16.3.tgz", + "integrity": "sha512-zCW2KzMfcEXqpVSU+MbLFMV3mHIzm/7UK1kT8mceuj4UwUScw7Lmjmulc2Ev4hcnwnaAFyaVkyFE5JXA4GKsLQ==", "dev": true, "license": "MIT", "dependencies": { - "detect-libc": "^1.0.3", + "@parcel/diagnostic": "2.16.3", + "@parcel/graph": "3.6.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/bundler-library": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/bundler-library/-/bundler-library-2.16.3.tgz", + "integrity": "sha512-DTFRSUtLQvRNkyzpAE7daEhVH6hMAyiEXztw7/doDKmea9VuXQJo3EfqdcycSxlkfkqijJ2XCdTCtK/hwnPm7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/cache": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/cache/-/cache-2.16.3.tgz", + "integrity": "sha512-iWlbdTk9h7yTG1fxpGvftUD7rVbXVQn1+U21BGqFyYxfrd+wgdN624daIG6+eqI6yBuaBTEwH+cb3kaI9sH1ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/fs": "2.16.3", + "@parcel/logger": "2.16.3", + "@parcel/utils": "2.16.3", + "lmdb": "2.8.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/codeframe": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/codeframe/-/codeframe-2.16.3.tgz", + "integrity": "sha512-oXZx8PUqExnXnAHCLhxulTDeFvTBqPAwJU4AVZwnYFToaQ6nltXWWYaDGUu2f/V3Z17LObWiOROHT7HYXAe62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/codeframe/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@parcel/codeframe/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/codeframe/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/compressor-raw": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/compressor-raw/-/compressor-raw-2.16.3.tgz", + "integrity": "sha512-84lI0ULxvjnqDn3yHorMHj2X2g0oQsIwNFYopQWz9UWjnF7g5IU0EFgAAqMCQxKKUV6fttqaQiDDPikXLR6hHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/config-default": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/config-default/-/config-default-2.16.3.tgz", + "integrity": "sha512-OgB6f+EpCzjeFLoVB5qJzKy0ybB2wPK0hB2aXgD3oYCHWLny7LJOGaktY9OskSn1jfz7Tdit9zLNXOhBTMRujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/bundler-default": "2.16.3", + "@parcel/compressor-raw": "2.16.3", + "@parcel/namer-default": "2.16.3", + "@parcel/optimizer-css": "2.16.3", + "@parcel/optimizer-html": "2.16.3", + "@parcel/optimizer-image": "2.16.3", + "@parcel/optimizer-svg": "2.16.3", + "@parcel/optimizer-swc": "2.16.3", + "@parcel/packager-css": "2.16.3", + "@parcel/packager-html": "2.16.3", + "@parcel/packager-js": "2.16.3", + "@parcel/packager-raw": "2.16.3", + "@parcel/packager-svg": "2.16.3", + "@parcel/packager-wasm": "2.16.3", + "@parcel/reporter-dev-server": "2.16.3", + "@parcel/resolver-default": "2.16.3", + "@parcel/runtime-browser-hmr": "2.16.3", + "@parcel/runtime-js": "2.16.3", + "@parcel/runtime-rsc": "2.16.3", + "@parcel/runtime-service-worker": "2.16.3", + "@parcel/transformer-babel": "2.16.3", + "@parcel/transformer-css": "2.16.3", + "@parcel/transformer-html": "2.16.3", + "@parcel/transformer-image": "2.16.3", + "@parcel/transformer-js": "2.16.3", + "@parcel/transformer-json": "2.16.3", + "@parcel/transformer-node": "2.16.3", + "@parcel/transformer-postcss": "2.16.3", + "@parcel/transformer-posthtml": "2.16.3", + "@parcel/transformer-raw": "2.16.3", + "@parcel/transformer-react-refresh-wrap": "2.16.3", + "@parcel/transformer-svg": "2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/core": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/core/-/core-2.16.3.tgz", + "integrity": "sha512-b9ll4jaFYfXSv6NZAOJ2P0uuyT/Doel7ho2AHLSUz2thtcL6HEb2+qdV2f9wriVvbEoPAj9VuSOgNc0t0f5iMw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.1", + "@parcel/cache": "2.16.3", + "@parcel/diagnostic": "2.16.3", + "@parcel/events": "2.16.3", + "@parcel/feature-flags": "2.16.3", + "@parcel/fs": "2.16.3", + "@parcel/graph": "3.6.3", + "@parcel/logger": "2.16.3", + "@parcel/package-manager": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/profiler": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3", + "@parcel/workers": "2.16.3", + "base-x": "^3.0.11", + "browserslist": "^4.24.5", + "clone": "^2.1.2", + "dotenv": "^16.5.0", + "dotenv-expand": "^11.0.7", + "json5": "^2.2.3", + "msgpackr": "^1.11.2", + "nullthrows": "^1.1.1", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/core/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/diagnostic": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/diagnostic/-/diagnostic-2.16.3.tgz", + "integrity": "sha512-NBoGGFMqOmbs8i0zGVwTeU0alQ0BkEZe894zAb5jEBQqsRBPmdqogwmARsT4Ix2bN1QBco4o0gn9kBtalFC6IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/error-overlay": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/error-overlay/-/error-overlay-2.16.3.tgz", + "integrity": "sha512-JqJR4Fl5SwTmqDEuCAC8F1LmNLWpjfiJ+hGp3CoLb0/9EElRxlpkuP/SxTe2/hyXevpfn3bfvS1cn/mWhHUc3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/events": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/events/-/events-2.16.3.tgz", + "integrity": "sha512-rAh/yXwtHYcKWmi9Tjjf5t95UdBVhhlyJkIYN25/PYKdSRBcQ9c1rd8/fvOeZKy1/fSiOcEXqm6dK7bhLSCaww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/feature-flags": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/feature-flags/-/feature-flags-2.16.3.tgz", + "integrity": "sha512-D15/cM/mAO8yv0NQ9kFBxXZ7C3A+jAq+9tVfrjYegofMk18pQoXJz6X/po2Kq1PzO7pjydn7PqYMB/O9p/+zbQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/fs": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-2.16.3.tgz", + "integrity": "sha512-InMXHVIfDUSimjBoGJcdNlNjoIsDQ8MUDN8UJG4jnjJQ6DDor+W+yg4sw/40tToUqIyi99lVhQlpkBA+nHLpOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/feature-flags": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/types-internal": "2.16.3", + "@parcel/utils": "2.16.3", + "@parcel/watcher": "^2.0.7", + "@parcel/workers": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/graph": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@parcel/graph/-/graph-3.6.3.tgz", + "integrity": "sha512-3qV99HCHrPR1CnMOHkwwpmPBimVMd3d/GcEcgOHUKi+2mS0KZ4TwMs/THaIWtJx7q5jrhqEht+IyQ1Smupo49g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/feature-flags": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/logger": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-2.16.3.tgz", + "integrity": "sha512-dHUJk8dvo2wOg3dIqSjNGqlVqsRn4hTZVbgTShaImaLTWdueaKfMojxo79P7T3em49y0dQb0m+xl2SunDhtwsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/events": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/markdown-ansi/-/markdown-ansi-2.16.3.tgz", + "integrity": "sha512-r0QQpS44jNueY8lcZcSoUua3kJfI5kDZrJvFgi1jrkyxwDUfq3L0xWQjxHrXzv8K6uFAeU+teoq8JcWLVLXa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/markdown-ansi/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@parcel/markdown-ansi/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/markdown-ansi/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/namer-default": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/namer-default/-/namer-default-2.16.3.tgz", + "integrity": "sha512-4MwRm8ZnloMdQ6sAMrTDxMiPVN1fV+UcBIrA0Fpp4kD3XLkqSAUCLnjl13+VrPelfh01irM6QnpK4JTKBqRk0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@parcel/node-resolver-core/-/node-resolver-core-3.7.3.tgz", + "integrity": "sha512-0xdXyhGcGwtYmfWwEwzdVVGnTaADdTScx1S8IXiK0Nh3S1b4ilGqnKzw8fVsJCsBMvQA5e251EDFeG3qTnUsnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mischnic/json-sourcemap": "^0.1.1", + "@parcel/diagnostic": "2.16.3", + "@parcel/fs": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/node-resolver-core/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/optimizer-css": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-css/-/optimizer-css-2.16.3.tgz", + "integrity": "sha512-j/o9bGtu1Fe7gJYQD+/SeJ5yR7FmS6Z7e6CtTkVxjeeq0/IdR0KoZOCkJ4cRETPnm+wkyQVlY8koAAFbEEqV8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "browserslist": "^4.24.5", + "lightningcss": "^1.30.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-html": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-html/-/optimizer-html-2.16.3.tgz", + "integrity": "sha512-EBmjY+QRa/in05wRWiL6B/kQ1ERemdg4W9py+V2w0tJx1n6yOvtjPGvivYtU+s82rlVlx6DN3DFU13iGRt0FuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-image": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-image/-/optimizer-image-2.16.3.tgz", + "integrity": "sha512-PbGsDXbbWyOnkpWn3jgZxtAp8l8LNXl7DCv5Q4l1TR6k4sULjmxTTPY6+AkY6H84cAN7s5h6F8k2XeN3ygXWCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3", + "@parcel/workers": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/optimizer-svg": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-svg/-/optimizer-svg-2.16.3.tgz", + "integrity": "sha512-fgQhrqu5pKtEaM9G//PvBZSuCDP6ZVbGyFnePKCzqnXJ173/Y+4kUbNOrPi7wE4HupWMsJRNUf/vyCu+lXdOiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/optimizer-swc": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/optimizer-swc/-/optimizer-swc-2.16.3.tgz", + "integrity": "sha512-8P5Bis2SynQ6sPW1bwB6H8WK+nFF61RCKzlGnTPoh1YE36dubYqUreYYISMLFt/rG8eb+Ja78DQLPZTVP3sfQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "@swc/core": "^1.11.24", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/package-manager": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/package-manager/-/package-manager-2.16.3.tgz", + "integrity": "sha512-TySTY93SyGfu8E5YWiekumw6sm/2+LBHcpv1JWWAfNd+1b/x3WB5QcRyEk6mpnOo7ChQOfqykzUaBcrmLBGaSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/fs": "2.16.3", + "@parcel/logger": "2.16.3", + "@parcel/node-resolver-core": "3.7.3", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3", + "@parcel/workers": "2.16.3", + "@swc/core": "^1.11.24", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/package-manager/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/packager-css": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-css/-/packager-css-2.16.3.tgz", + "integrity": "sha512-CUwMRif1ZGBfociDt6m18L7sgafsquo0+NYRDXCTHmig3w7zm5saE4PXborfzRI/Lj3kBUkJYH//NQGITHv1Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "lightningcss": "^1.30.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-html": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-html/-/packager-html-2.16.3.tgz", + "integrity": "sha512-hluJXpvcW2EwmBxO/SalBiX5SIYJ7jGTkhFq5ka2wrQewFxaAOv2BVTuFjl1AAnWzjigcNhC4n0jkQUckCNW4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-js": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-js/-/packager-js-2.16.3.tgz", + "integrity": "sha512-01fufzVOs9reEDq9OTUyu5Kpasd8nGvBJEUytagM6rvNlEpmlUX5HvoAzUMSTyYeFSH+1VnX6HzK6EcQNY9Y8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3", + "globals": "^13.24.0", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-raw": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-raw/-/packager-raw-2.16.3.tgz", + "integrity": "sha512-GCehb36D2xe8P8gftyZcjNr3XcUzBgRzWcasM4I0oPaLRZw4nuIu60cwTsGk6/HhUYDq8uPze+gr1L4pApRrjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-svg": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-svg/-/packager-svg-2.16.3.tgz", + "integrity": "sha512-1TLmU8zcRBySOD3WXGUhTjmIurJoOMwQ3aIiyHXn4zjrl4+VPw/WnUoVGpMwUW1T7rb2/22BKPGAAxbOLDqxLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-ts": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-ts/-/packager-ts-2.16.3.tgz", + "integrity": "sha512-N+Ok3qyZLl3FxtH/qn0klJhsGV3qOaTJX/D3RdKYoQUQ365SEBaqNllJjNJjUetRDEai77Hy9phHC4A+gyFeVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/packager-wasm": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/packager-wasm/-/packager-wasm-2.16.3.tgz", + "integrity": "sha512-RfRM/RaA4eWV+qUt7A9Vo2VlvZx50Rfs81kZ4WBhxzey2BGAvBSJWceYEUnI7JuDmrHjDMDe6y0+gLNmELeL1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">=16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/plugin": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/plugin/-/plugin-2.16.3.tgz", + "integrity": "sha512-w4adN/E2MBbNzUwuGWcUkilrf7B6eQThPRdgiw2awIY0/t0C1gN/hhBfUeWt7vt0WcvWlXcyR/OGzU/r0nPteA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/types": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/profiler": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/profiler/-/profiler-2.16.3.tgz", + "integrity": "sha512-/4cVsLfv36fdphm+JiReeXXT3RD6258L79C2kjpD06i84sxyNPQVbFldgWRppbHW2KBR/D6XhIzHcwoDUYtTbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/events": "2.16.3", + "@parcel/types-internal": "2.16.3", + "chrome-trace-event": "^1.0.2" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/reporter-cli/-/reporter-cli-2.16.3.tgz", + "integrity": "sha512-kIwhJy97xlgvNsUhn3efp6PxUfWCiiPG9ciDnAGBXpFmKWl63WQR6QIXNuNgrQremUTzIHJ02h6/+LyBJD4wjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/types": "2.16.3", + "@parcel/utils": "2.16.3", + "chalk": "^4.1.2", + "term-size": "^2.2.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/reporter-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/reporter-dev-server": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/reporter-dev-server/-/reporter-dev-server-2.16.3.tgz", + "integrity": "sha512-c2YEHU3ePOSUO+JXoehn3r0ruUlP2i4xvHfwHLHI3NW/Ymlp4Gy9rWyyYve/zStfoEOyMN/vKRWKtxr6nCy9DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/codeframe": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/reporter-tracer": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/reporter-tracer/-/reporter-tracer-2.16.3.tgz", + "integrity": "sha512-DqQQRQC6JKQcYo8fAC69JGri++WC9cTRZFH2QJdbcMXnmeCW0YjBwHsl65C0Q/8aO6lwVlV0P1waMPW3iQw+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3", + "chrome-trace-event": "^1.0.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/resolver-default": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/resolver-default/-/resolver-default-2.16.3.tgz", + "integrity": "sha512-2bf2VRKt1fZRZbi85SBLrePr4Eid0zXUQMy+MRcFoVZ8MaxsjvWjnlxHW71cWNcRQATUOX/0w0z0Gcf7Kjrh2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/node-resolver-core": "3.7.3", + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-browser-hmr": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/runtime-browser-hmr/-/runtime-browser-hmr-2.16.3.tgz", + "integrity": "sha512-dN5Kv6/BLaKAf80zogimvSPZYQRA+h+o3rKQLnxid2FilVRTCjz+FOcuMsT/EqAJXai1mKjrxtqlM9IJ4oSV1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-js": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/runtime-js/-/runtime-js-2.16.3.tgz", + "integrity": "sha512-Xk1G7A0g5Dbm374V8piDbxLRQoQ1JiKIChXzQuiQ755A22JYOSP0yA2djBEuB7KWPwFKDd4f9DFTVDn6VclPaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-rsc": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/runtime-rsc/-/runtime-rsc-2.16.3.tgz", + "integrity": "sha512-QR+4BjGE2OqLcjh6WfAMrNoM0FubxvJNH9p31yjI4H1ivrvTJECanvVZ6C7QRR/30l+WAYb5USrcYJVMwHi1zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 12.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/runtime-service-worker": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/runtime-service-worker/-/runtime-service-worker-2.16.3.tgz", + "integrity": "sha512-O+jhRFNThRAxsHOW6RYcYR6+sA9MxeGTmbVRguFyM12OqzuXRTuuv9x2RDSGP/cgBBCpVuq5JvK8KwS2RB26Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust/-/rust-2.16.3.tgz", + "integrity": "sha512-pUsgURnDdlHA9AqvEcm124/9+DB7GM7Mk0qQ9XDNiznl09n8XZ67lf/IIvaMW7y0vQ7FpTzRIrRzAJhGyMRbMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/rust-darwin-arm64": "2.16.3", + "@parcel/rust-darwin-x64": "2.16.3", + "@parcel/rust-linux-arm-gnueabihf": "2.16.3", + "@parcel/rust-linux-arm64-gnu": "2.16.3", + "@parcel/rust-linux-arm64-musl": "2.16.3", + "@parcel/rust-linux-x64-gnu": "2.16.3", + "@parcel/rust-linux-x64-musl": "2.16.3", + "@parcel/rust-win32-x64-msvc": "2.16.3" + }, + "peerDependencies": { + "napi-wasm": "^1.1.2" + }, + "peerDependenciesMeta": { + "napi-wasm": { + "optional": true + } + } + }, + "node_modules/@parcel/rust-darwin-arm64": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-darwin-arm64/-/rust-darwin-arm64-2.16.3.tgz", + "integrity": "sha512-9JG19DDNjIpvlI1b8VYIjvCaulftd6/J09/Rj2A8KgREv6EtCDkus8jCsNw7Jacj2HIWg23kxJY3XKcJ9pkiug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-darwin-x64": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-darwin-x64/-/rust-darwin-x64-2.16.3.tgz", + "integrity": "sha512-9mG6M6SGYiCO9IfD85Bixg5udXoy2IQHCRdBoQmpNej5+FrDW1a3FeDwDzqOFtl9b7axpzPEVb7zp+WK36Rn4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-linux-arm-gnueabihf": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-linux-arm-gnueabihf/-/rust-linux-arm-gnueabihf-2.16.3.tgz", + "integrity": "sha512-zSA1Dz5JWS28DkEMjEQNmf8qk55dR6rcKtwrw5CMg3Ndt30ugrGtRechsqEpXSYYxcDY1kmZ779LwiTUdkdCrQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-linux-arm64-gnu": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-linux-arm64-gnu/-/rust-linux-arm64-gnu-2.16.3.tgz", + "integrity": "sha512-PvjO0U6qM0JjRCH2eKi3JNKgBVWDBP3VrMEUXJJM8K37ylfLTozK0f7oK2M03voCS1WjKrduRGjJNk8EZrBPow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-linux-arm64-musl": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-linux-arm64-musl/-/rust-linux-arm64-musl-2.16.3.tgz", + "integrity": "sha512-a4TZB9/Y/y8DQ55XZXh9bNb5yIC9CAoK2YK8g3OytauC8OrHGtIIVlF+E1UCn/FPBFr2dobYOeih/InvLKITpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-linux-x64-gnu": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-linux-x64-gnu/-/rust-linux-x64-gnu-2.16.3.tgz", + "integrity": "sha512-6/a/5jDcVwE0xpLSLGI9T2pclgnad0jVFRH/4Gm9yQ5fl2gpYghjg3fcCNeSjJ/aBNFKlOeKLlp/oBSlTtlkoQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-linux-x64-musl": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-linux-x64-musl/-/rust-linux-x64-musl-2.16.3.tgz", + "integrity": "sha512-gTUlFvJBLR3UxNjGs076wVuFZyx+X6G6opJzBFaSG9XqLhLo+VrpqHpjCx+SCwSufDLTVq8rWJbwpvbe2EhRJg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/rust-win32-x64-msvc": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/rust-win32-x64-msvc/-/rust-win32-x64-msvc-2.16.3.tgz", + "integrity": "sha512-/kyr5CL4XFJpMj9CvW8K1NNNqkzyOhxc7ibXhykiPyPiGOwO/ZbqnfDhqVx3JMSjOASeW1e6UlGNjnfTPvFkGQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/source-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@parcel/source-map/-/source-map-2.1.1.tgz", + "integrity": "sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + }, + "engines": { + "node": "^12.18.3 || >=14" + } + }, + "node_modules/@parcel/source-map/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@parcel/transformer-babel": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-babel/-/transformer-babel-2.16.3.tgz", + "integrity": "sha512-Jsusa2xWlgrmBYmvuC70/SIvcNdYZj3NyQhCxTOARV2scksSKH8iSvNsMKepYiZl6nHRNOmnGOShz9xJqNpUDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "browserslist": "^4.24.5", + "json5": "^2.2.3", + "nullthrows": "^1.1.1", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-babel/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/transformer-css": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-css/-/transformer-css-2.16.3.tgz", + "integrity": "sha512-RKGfjvQQVYpd27Ag7QHzBEjqfN/hj6Yf6IlbUdOp06bo+XOXQXe5/n2ulJ1EL9ZjyDOtXbB94A7QzSQmtFGEow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "browserslist": "^4.24.5", + "lightningcss": "^1.30.1", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-html": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-html/-/transformer-html-2.16.3.tgz", + "integrity": "sha512-j/f+fR3hS9g3Kw4mySyF2sN4mp0t6amq3x52SAptpa4C7w8XVWproc+3ZLgjzi91OPqNeQAQUNQMy86AfuMuEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-image": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-image/-/transformer-image-2.16.3.tgz", + "integrity": "sha512-q8BhaGSaGtIP1JPxDpRoRxs5Oa17sVR4c0kyPyxwP0QoihKth1eQElbINx+7Ikbt7LoGucPUKEsnxrDzkUt8og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3", + "@parcel/workers": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/transformer-js": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-js/-/transformer-js-2.16.3.tgz", + "integrity": "sha512-k83yElHagwDRYfza7BrADdf9NRGpizX3zOfctfEsQWh9mEZLNJENivP6ZLB9Aje9H0GaaSTiYU8VwOWLXbLgOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/utils": "2.16.3", + "@parcel/workers": "2.16.3", + "@swc/helpers": "^0.5.0", + "browserslist": "^4.24.5", + "nullthrows": "^1.1.1", + "regenerator-runtime": "^0.14.1", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" + } + }, + "node_modules/@parcel/transformer-js/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@parcel/transformer-js/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/transformer-json": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-json/-/transformer-json-2.16.3.tgz", + "integrity": "sha512-iT4IKGT95+S/7RBK1MUY/KxD8ad9FUlElF+w40NBLv4lm012wkYogFRhEHnyElPOByZL1aJ8GaVOGbZL9yuZfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "json5": "^2.2.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-node": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-node/-/transformer-node-2.16.3.tgz", + "integrity": "sha512-FIbSphLisxmzwqE43ALsGeSPSYBA3ZE6xmhAIgwoFdeI6VfTSkCZnGhSqUhP3m9R55IuWm/+NP6BlePWADmkwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-postcss/-/transformer-postcss-2.16.3.tgz", + "integrity": "sha512-OMjU17OwPhPBK2LIzqQozBezolqI8jPgoT+CmoOkKr1GlgWMzCcHFpW6KQZxVVR+vI0lUEJp+RZc9MzhNndv4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/utils": "2.16.3", + "clone": "^2.1.2", + "nullthrows": "^1.1.1", + "postcss-value-parser": "^4.2.0", + "semver": "^7.7.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-postcss/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@parcel/transformer-posthtml": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-posthtml/-/transformer-posthtml-2.16.3.tgz", + "integrity": "sha512-y3iuM+yp8nPbt8sbQayPGR0saVGR6uj0aYr7hWoS0oUe9vZsH1mP3BTP6L6ABe/dZKU3QcFmMQgLwH6WC/apAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-raw": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-raw/-/transformer-raw-2.16.3.tgz", + "integrity": "sha512-Lha1+z75QbNAsxMAffp5K+ykGXEYSNOFUqI/8XtetYfuqIvS5s/OBkwsg8MWbjtPkbKo1F3EwNBaIAagw/BbIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/plugin": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-react-refresh-wrap": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-react-refresh-wrap/-/transformer-react-refresh-wrap-2.16.3.tgz", + "integrity": "sha512-8rzO5iKF5bYrPUnbw4At0H7AwE+UHkuNNo385JL0VzXggrA0VsXsjjJwXVyhSeMvEbo2ioo/+nYUlazTQBABwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/error-overlay": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/utils": "2.16.3", + "react-refresh": "^0.16.0" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-svg": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-svg/-/transformer-svg-2.16.3.tgz", + "integrity": "sha512-fDpUWSBZxt/R5pZUNd4gV/BX0c7B074lw/wmqwowjcwQU/QxhzPJBDlAsyTvOJ75PeJiQf/qFtnIK5bNwMoasA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/rust": "2.16.3" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/transformer-typescript-types": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/transformer-typescript-types/-/transformer-typescript-types-2.16.3.tgz", + "integrity": "sha512-9ARQ5A0ndm7XECpSjij4mSrNjn+pE9vakVxyaP7RJuy3NUhNc+QD/AQTKxG4gidQ2g8B0U33utZ+NsPeyVlByg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/plugin": "2.16.3", + "@parcel/source-map": "^2.1.1", + "@parcel/ts-utils": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0", + "parcel": "^2.16.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/ts-utils": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/ts-utils/-/ts-utils-2.16.3.tgz", + "integrity": "sha512-Av6+DnWvM9/s0HhTdw85ZAe/g0zBqIt7IPwM9euOAj6b9ap0LKiOBBFGTubedbp7KpsdtrY4RLM0RxBYZXhqOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "typescript": ">=3.0.0" + } + }, + "node_modules/@parcel/types": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/types/-/types-2.16.3.tgz", + "integrity": "sha512-aIJJFMif/A7u86UEt3sJPZ/F7suQW56ugiCp2Y2mYTPHpTJbI2Knk9yO4fkWHNO1BrH6a/VUWh7bWIOsQtzL1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/types-internal": "2.16.3", + "@parcel/workers": "2.16.3" + } + }, + "node_modules/@parcel/types-internal": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/types-internal/-/types-internal-2.16.3.tgz", + "integrity": "sha512-zi2GKdJHpNeW9sspTBfM68A9lekEztTWU8Dxs1ouPk90lfA0tfrMznAvkD5iJdKsM6usbgcqjjI8s+Ow8OrsBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/feature-flags": "2.16.3", + "@parcel/source-map": "^2.1.1", + "utility-types": "^3.11.0" + } + }, + "node_modules/@parcel/utils": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-2.16.3.tgz", + "integrity": "sha512-g/yqVWSdZqPvTiS96dEK9MEl7q6w31u+luD5VGt6f9w6PQCpuVajhhDNuXf9uzDU/dL4sSZPKUhLteVZDqryHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/codeframe": "2.16.3", + "@parcel/diagnostic": "2.16.3", + "@parcel/logger": "2.16.3", + "@parcel/markdown-ansi": "2.16.3", + "@parcel/rust": "2.16.3", + "@parcel/source-map": "^2.1.1", + "chalk": "^4.1.2", + "nullthrows": "^1.1.1" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@parcel/utils/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.3", "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">= 10.0.0" @@ -4800,24 +6739,25 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" } }, "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", "cpu": [ "arm64" ], @@ -4836,7 +6776,9 @@ } }, "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", "cpu": [ "arm64" ], @@ -4855,9 +6797,9 @@ } }, "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", "cpu": [ "x64" ], @@ -4876,9 +6818,9 @@ } }, "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", "cpu": [ "x64" ], @@ -4897,9 +6839,30 @@ } }, "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", "cpu": [ "arm" ], @@ -4918,9 +6881,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", "cpu": [ "arm64" ], @@ -4939,9 +6902,9 @@ } }, "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", "cpu": [ "arm64" ], @@ -4960,9 +6923,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", "cpu": [ "x64" ], @@ -4981,9 +6944,9 @@ } }, "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", "cpu": [ "x64" ], @@ -5002,9 +6965,9 @@ } }, "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", "cpu": [ "arm64" ], @@ -5023,9 +6986,9 @@ } }, "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", "cpu": [ "ia32" ], @@ -5044,9 +7007,9 @@ } }, "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", "cpu": [ "x64" ], @@ -5064,15 +7027,42 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", + "node_modules/@parcel/watcher/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@parcel/workers": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-2.16.3.tgz", + "integrity": "sha512-SxIXRnrlQFhw377wxWC5WIl1FL1Y9IedhUtuc7j3uac3tlbCQJJ+3rFr5/BDUknJbTktvVsPakE98fH7TIJyyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/diagnostic": "2.16.3", + "@parcel/logger": "2.16.3", + "@parcel/profiler": "2.16.3", + "@parcel/types-internal": "2.16.3", + "@parcel/utils": "2.16.3", + "nullthrows": "^1.1.1" }, "engines": { - "node": ">=0.10" + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "peerDependencies": { + "@parcel/core": "^2.16.3" } }, "node_modules/@pkgjs/parseargs": { @@ -5311,6 +7301,262 @@ "stylelint": "^16.8.0" } }, + "node_modules/@swc/core": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.10.tgz", + "integrity": "sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.10", + "@swc/core-darwin-x64": "1.15.10", + "@swc/core-linux-arm-gnueabihf": "1.15.10", + "@swc/core-linux-arm64-gnu": "1.15.10", + "@swc/core-linux-arm64-musl": "1.15.10", + "@swc/core-linux-x64-gnu": "1.15.10", + "@swc/core-linux-x64-musl": "1.15.10", + "@swc/core-win32-arm64-msvc": "1.15.10", + "@swc/core-win32-ia32-msvc": "1.15.10", + "@swc/core-win32-x64-msvc": "1.15.10" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.10.tgz", + "integrity": "sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.10.tgz", + "integrity": "sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.10.tgz", + "integrity": "sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.10.tgz", + "integrity": "sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.10.tgz", + "integrity": "sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.10.tgz", + "integrity": "sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.10.tgz", + "integrity": "sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.10.tgz", + "integrity": "sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.10.tgz", + "integrity": "sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.10.tgz", + "integrity": "sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.18.tgz", + "integrity": "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@swc/jest": { + "version": "0.2.39", + "resolved": "https://registry.npmjs.org/@swc/jest/-/jest-0.2.39.tgz", + "integrity": "sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/create-cache-key-function": "^30.0.0", + "@swc/counter": "^0.1.3", + "jsonc-parser": "^3.2.0" + }, + "engines": { + "npm": ">= 7.0.0" + }, + "peerDependencies": { + "@swc/core": "*" + } + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@tanstack/react-table": { "version": "8.10.7", "license": "MIT", @@ -5780,6 +8026,8 @@ }, "node_modules/@types/node": { "version": "24.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", + "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", "license": "MIT", "dependencies": { "undici-types": "~7.16.0" @@ -5877,7 +8125,6 @@ "version": "18.2.25", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/react": "*" } @@ -7554,6 +9801,16 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/base-x": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/base64-js": { "version": "1.5.1", "funding": [ @@ -8705,6 +10962,16 @@ "node": ">=8" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "dev": true, @@ -9823,8 +12090,8 @@ }, "node_modules/detect-libc": { "version": "2.0.3", + "devOptional": true, "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -9971,6 +12238,35 @@ "tslib": "^2.0.3" } }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/download": { "version": "6.2.5", "dev": true, @@ -10945,19 +13241,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", "license": "MIT", @@ -10985,16 +13268,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "9.6.1", "license": "BSD-2-Clause", @@ -11992,6 +14265,16 @@ "node": ">=8.0.0" } }, + "node_modules/get-port": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/get-proto": { "version": "1.0.1", "license": "MIT", @@ -12200,6 +14483,33 @@ "which": "bin/which" } }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globalthis": { "version": "1.0.4", "license": "MIT", @@ -15908,6 +18218,13 @@ "node": ">=6" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, "node_modules/jsonfile": { "version": "6.1.0", "dev": true, @@ -16050,10 +18367,304 @@ "immediate": "~3.0.5" } }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "license": "MIT" }, + "node_modules/lmdb": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-2.8.5.tgz", + "integrity": "sha512-9bMdFfc80S+vSldBmG3HOuLVHnxRdNTlpzR6QDnzqCQtCzGUEAGTzBKYMeIM+I/sU4oZfgbcbS7X7F65/z/oxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "msgpackr": "^1.9.5", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.1.1", + "ordered-binary": "^1.4.1", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "2.8.5", + "@lmdb/lmdb-darwin-x64": "2.8.5", + "@lmdb/lmdb-linux-arm": "2.8.5", + "@lmdb/lmdb-linux-arm64": "2.8.5", + "@lmdb/lmdb-linux-x64": "2.8.5", + "@lmdb/lmdb-win32-x64": "2.8.5" + } + }, + "node_modules/lmdb/node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT" + }, "node_modules/load-bmfont": { "version": "1.4.2", "dev": true, @@ -16647,6 +19258,55 @@ "version": "2.1.3", "license": "MIT" }, + "node_modules/msgpackr": { + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.8.tgz", + "integrity": "sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", + "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" + } + }, + "node_modules/msgpackr-extract/node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/multicast-dns": { "version": "7.2.5", "dev": true, @@ -16856,6 +19516,21 @@ "node": ">= 6.13.0" } }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, "node_modules/node-int64": { "version": "0.4.0", "dev": true, @@ -17000,6 +19675,13 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true, + "license": "MIT" + }, "node_modules/nwsapi": { "version": "2.2.23", "dev": true, @@ -17239,6 +19921,13 @@ "node": ">=10" } }, + "node_modules/ordered-binary": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", + "dev": true, + "license": "MIT" + }, "node_modules/os-filter-obj": { "version": "2.0.0", "dev": true, @@ -17462,6 +20151,90 @@ "tslib": "^2.0.3" } }, + "node_modules/parcel": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/parcel/-/parcel-2.16.3.tgz", + "integrity": "sha512-N9jnwcTeVEaRjjJCCHmYfPCvjjJeHZuuO50qL4CCNcQX4RjwPuOaDft7hvTT2W8PIb4XhhZKDYB1lstZhXLJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/config-default": "2.16.3", + "@parcel/core": "2.16.3", + "@parcel/diagnostic": "2.16.3", + "@parcel/events": "2.16.3", + "@parcel/feature-flags": "2.16.3", + "@parcel/fs": "2.16.3", + "@parcel/logger": "2.16.3", + "@parcel/package-manager": "2.16.3", + "@parcel/reporter-cli": "2.16.3", + "@parcel/reporter-dev-server": "2.16.3", + "@parcel/reporter-tracer": "2.16.3", + "@parcel/utils": "2.16.3", + "chalk": "^4.1.2", + "commander": "^12.1.0", + "get-port": "^4.2.0" + }, + "bin": { + "parcel": "lib/bin.js" + }, + "engines": { + "node": ">= 16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/parcel/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/parcel/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/parcel/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/parcel/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", @@ -18726,6 +21499,16 @@ } } }, + "node_modules/react-refresh": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.16.0.tgz", + "integrity": "sha512-FPvF2XxTSikpJxcr+bHut2H4gJ17+18Uy20D5/F+SKzFap62R3cM5wH6b8WN3LyGSYeQilLEcJcR1fjBSI2S1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/react-router": { "version": "5.3.4", "license": "MIT", @@ -21445,6 +24228,19 @@ "uuid": "bin/uuid" } }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.36.0", "license": "BSD-2-Clause", @@ -22239,6 +25035,16 @@ "dev": true, "license": "MIT" }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "dev": true, @@ -22335,6 +25141,13 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT" + }, "node_modules/web-vitals": { "version": "5.0.3", "license": "Apache-2.0" @@ -23326,6 +26139,174 @@ } } }, + "platform/shared": { + "name": "@mattermost/shared", + "version": "11.4.0", + "license": "MIT", + "dependencies": { + "classnames": "^2.3.1" + }, + "devDependencies": { + "@mattermost/eslint-plugin": "*", + "@parcel/bundler-library": "^2.16.3", + "@parcel/packager-ts": "^2.16.3", + "@parcel/transformer-typescript-types": "^2.16.3", + "@stylistic/stylelint-plugin": "^3.1.2", + "@swc/core": "^1.3.36", + "@swc/jest": "^0.2.36", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", + "@types/node": "^24.10.4", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "jest": "^30.1.3", + "jest-environment-jsdom": "^30.1.0", + "parcel": "^2.16.3", + "react": "^18.2.0", + "stylelint": "^16.10.0", + "stylelint-config-idiomatic-order": "^10.0.0", + "stylelint-config-recommended": "^14.0.1", + "stylelint-order": "^6.0.4", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "@mattermost/types": "11.4.0", + "@testing-library/react": "^16", + "react": ">=17", + "react-intl": ">=7", + "typescript": "^4.3.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@testing-library/react": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "platform/shared/node_modules/@jest/environment-jsdom-abstract": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.1.0.tgz", + "integrity": "sha512-hZyUBiTwI3JrO7QNhL6ID0PZZ+ZtFGEm5cCrh8d3LrSkK0EbL9fhgX/Pqa/ZXOvukvu4XHpMMiA+4Qj9MyAZUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.0", + "@jest/fake-timers": "30.1.0", + "@jest/types": "30.0.5", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jest-mock": "30.0.5", + "jest-util": "30.0.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "platform/shared/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "platform/shared/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "platform/shared/node_modules/jest-environment-jsdom": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.1.0.tgz", + "integrity": "sha512-Y0gOO15Kd2SzHnIvGPG5TqZ27ungxA3sTs4DrRqPeFMYAE+cO4FmVeMPPNgckdtab6LothC2BarlbS+hHHWf+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.1.0", + "@jest/environment-jsdom-abstract": "30.1.0", + "@types/jsdom": "^21.1.7", + "@types/node": "*", + "jsdom": "^26.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "platform/shared/node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "platform/types": { "name": "@mattermost/types", "version": "11.4.0", diff --git a/webapp/package.json b/webapp/package.json index ebebe6a58b4..71820f4f1f8 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -6,7 +6,7 @@ "npm": "^10 || ^11" }, "scripts": { - "postinstall": "patch-package && npm run build --workspace=platform/types --workspace=platform/client --workspace=platform/components", + "postinstall": "patch-package && npm run build --workspace platform/types --workspace platform/client --workspace platform/components --workspace platform/shared", "build": "node scripts/build.mjs", "run": "node scripts/run.mjs", "dev-server": "node scripts/dev-server.mjs", @@ -18,7 +18,7 @@ "check-types": "npm run check-types --workspaces --if-present", "i18n-extract": "npm run i18n-extract --workspaces --if-present", "i18n-extract:check": "npm run i18n-extract:check --workspaces --if-present", - "clean": "npm run clean --workspaces --if-present", + "clean": "npm run clean --workspaces --if-present && rm -rf node_modules .parcel-cache", "gen-lang-imports": "node scripts/gen_lang_imports.mjs" }, "dependencies": { @@ -90,6 +90,7 @@ "platform/components", "platform/eslint-plugin", "platform/mattermost-redux", + "platform/shared", "platform/types" ] } diff --git a/webapp/platform/shared/.eslintrc.json b/webapp/platform/shared/.eslintrc.json new file mode 100644 index 00000000000..f3d1e542a79 --- /dev/null +++ b/webapp/platform/shared/.eslintrc.json @@ -0,0 +1,20 @@ +{ + "root": true, + "extends": [ + "plugin:@mattermost/react" + ], + "plugins": [ + "formatjs", + "no-only-tests" + ], + "rules": { + }, + "overrides": [ + { + "files": ["*.test.*", "src/tests/**"], + "rules": { + "no-only-tests/no-only-tests": ["error", {"focus": ["only", "skip"]}] + } + } + ] +} diff --git a/webapp/platform/shared/.parcelrc b/webapp/platform/shared/.parcelrc new file mode 100644 index 00000000000..c755243d01f --- /dev/null +++ b/webapp/platform/shared/.parcelrc @@ -0,0 +1,5 @@ +{ + "extends": "@parcel/config-default", + "bundler": "@parcel/bundler-library", + "namers": ["./parcel-namer-shared", "..."] +} diff --git a/webapp/platform/shared/.stylelintignore b/webapp/platform/shared/.stylelintignore new file mode 100644 index 00000000000..849ddff3b7e --- /dev/null +++ b/webapp/platform/shared/.stylelintignore @@ -0,0 +1 @@ +dist/ diff --git a/webapp/platform/shared/.stylelintrc.json b/webapp/platform/shared/.stylelintrc.json new file mode 100644 index 00000000000..d7525eeab5c --- /dev/null +++ b/webapp/platform/shared/.stylelintrc.json @@ -0,0 +1,42 @@ +{ + "extends": [ + "stylelint-config-idiomatic-order", + "stylelint-config-recommended-scss" + ], + "plugins": [ + "@stylistic/stylelint-plugin" + ], + "rules": { + "@stylistic/indentation": 4, + "@stylistic/no-missing-end-of-source-newline": true, + "no-descending-specificity": null, + "font-family-no-missing-generic-family-keyword": null, + "property-no-unknown": [ + true, + { + "ignoreProperties": ["scrollbar-3dlight-color"] + } + ], + "block-no-empty": [ + true, + { + "ignore": ["comments"] + } + ], + "declaration-property-value-disallowed-list": [ + { + "color": ["/--denim-button-bg/"], + "background-color": ["/--denim-button-bg/"], + "border-color": ["/--denim-button-bg/"], + "background": ["/--denim-button-bg/"], + "border": ["/--denim-button-bg/"], + "fill": ["/--denim-button-bg/"] + }, + { + "message": "The --denim-button-bg and --denim-button-bg-rgb variables are deprecated. Please use --button-bg or --button-bg-rgb instead." + } + ], + "scss/load-no-partial-leading-underscore": null, + "scss/at-extend-no-missing-placeholder": null + } +} diff --git a/webapp/platform/shared/README.md b/webapp/platform/shared/README.md new file mode 100644 index 00000000000..51312c79dba --- /dev/null +++ b/webapp/platform/shared/README.md @@ -0,0 +1,32 @@ +# Mattermost Shared Package + +[![npm version](https://img.shields.io/npm/v/@mattermost/shared?style=flat)](https://www.npmjs.com/package/@mattermost/shared) + +This package contains shared components and other utilities for use by the Mattermost web app and its plugins. + +> [!CAUTION] +> This is a pre-release package in active development. It is currently for internal use only, and it may change significantly between now and when it is fully released. + +## Installation + +This package requires a matching version of the `@mattermost/types` package. It also requires [React](https://react.dev/) and [React Intl](https://formatjs.github.io/docs/react-intl/). + +```sh +$ npm install @mattermost/shared @mattermost/types +``` + +Additionally, if you're writing unit tests involving these components, [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/) is also required. + +```sh +$ npm install @testing-library/react +``` + +## Usage + +TODO + +## Development + +### Compilation and Packaging + +TODO diff --git a/webapp/platform/shared/jest.config.js b/webapp/platform/shared/jest.config.js new file mode 100644 index 00000000000..b1c2aa08d54 --- /dev/null +++ b/webapp/platform/shared/jest.config.js @@ -0,0 +1,44 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +/** @type {import('jest').Config} */ + +export default { + moduleDirectories: ['src', 'node_modules'], + testEnvironment: 'jsdom', + testPathIgnorePatterns: ['/node_modules/', '/dist/'], + clearMocks: true, + moduleNameMapper: { + '^.+\\.css$': 'identity-obj-proxy', + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + transform: { + '^.+\\.(t|j)sx?$': [ + '@swc/jest', + { + jsc: { + parser: { + syntax: 'typescript', + tsx: true, + importAssertions: true, + }, + + transform: { + react: { + runtime: 'automatic', + }, + }, + }, + }, + ], + }, + setupFilesAfterEnv: ['/setup_jest.ts'], + collectCoverageFrom: [ + 'src/**/*.{js,jsx,ts,tsx}', + ], + coveragePathIgnorePatterns: [ + '/node_modules/', + '/dist/', + ], + coverageReporters: ['json', 'lcov', 'text-summary'], +}; diff --git a/webapp/platform/shared/package.json b/webapp/platform/shared/package.json new file mode 100644 index 00000000000..b2402045b0e --- /dev/null +++ b/webapp/platform/shared/package.json @@ -0,0 +1,110 @@ +{ + "name": "@mattermost/shared", + "version": "11.4.0", + "description": "Shared components and utilities for use by the Mattermost web app and its plugins", + "keywords": [ + "mattermost" + ], + "homepage": "https://github.com/mattermost/mattermost/tree/master/webapp/platform/shared#readme", + "license": "MIT", + "files": [ + "dist", + "src" + ], + "main": "dist/main.js", + "module": "dist/module.js", + "source": "src/**/index.ts", + "types": "dist/types.d.ts", + "typesVersions": { + ">=3.1": { + "*": [ + "./dist/*/index.d.ts" + ] + } + }, + "exports": { + ".": { + "types": [ + "./src/index.ts", + "./dist/types.d.ts" + ], + "source": "./src/index.ts", + "import": "./dist/module.js", + "require": "./dist/main.js" + }, + "./*": { + "types": [ + "./src/*/index.ts", + "./dist/*/index.d.ts" + ], + "source": "./src/*/index.ts", + "import": "./dist/*/index.module.js", + "require": "./dist/*/index.main.js" + } + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mattermost/mattermost.git", + "directory": "webapp/platform/shared" + }, + "dependencies": { + "classnames": "^2.3.1" + }, + "devDependencies": { + "@mattermost/eslint-plugin": "*", + "@parcel/bundler-library": "^2.16.3", + "@parcel/packager-ts": "^2.16.3", + "@parcel/transformer-typescript-types": "^2.16.3", + "@stylistic/stylelint-plugin": "^3.1.2", + "@swc/core": "^1.3.36", + "@swc/jest": "^0.2.36", + "@testing-library/dom": "^10.4.1", + "@testing-library/jest-dom": "^6.8.0", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/jest": "^30.0.0", + "@types/node": "^24.10.4", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.0", + "eslint-plugin-react-hooks": "^4.6.0", + "jest": "^30.1.3", + "jest-environment-jsdom": "^30.1.0", + "parcel": "^2.16.3", + "react": "^18.2.0", + "stylelint": "^16.10.0", + "stylelint-config-idiomatic-order": "^10.0.0", + "stylelint-config-recommended": "^14.0.1", + "stylelint-order": "^6.0.4", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "@mattermost/types": "11.4.0", + "@testing-library/react": "^16", + "react": ">=17", + "react-intl": ">=7", + "typescript": "^4.3.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@testing-library/react": { + "optional": true + }, + "typescript": { + "optional": true + } + }, + "scripts": { + "build": "parcel build --no-optimize", + "check": "npm run check:eslint && npm run check:stylelint", + "check:eslint": "eslint --ext .js,.jsx,.tsx,.ts ./src --quiet", + "check:stylelint": "stylelint \"**/*.{css,scss}\"", + "check-types": "tsc -b", + "fix": "eslint --ext .js,.jsx,.tsx,.ts ./src --quiet --fix && stylelint \"**/*.{css,scss}\" --fix", + "run": "parcel watch", + "test": "jest", + "test-ci": "jest --ci --forceExit --detectOpenHandles --maxWorkers=100% --logHeapUsage", + "clean": "rm -rf dist node_modules *.tsbuildinfo .parcel-cache" + }, + "@parcel/resolver-default": { + "packageExports": true + } +} diff --git a/webapp/platform/shared/parcel-namer-shared.ts b/webapp/platform/shared/parcel-namer-shared.ts new file mode 100644 index 00000000000..c3b8e95c49f --- /dev/null +++ b/webapp/platform/shared/parcel-namer-shared.ts @@ -0,0 +1,44 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import * as path from 'node:path'; + +import {Namer} from '@parcel/plugin'; +import type {FilePath} from '@parcel/types'; + +/** + * This Namer changes how Parcel outputs its files to put them into subfolders based on where they were originally in + * the source folder. + * + * By default, files output by Parcel are not put into subfolders of dist, and they instead rely on hashes to + * differentiate between them. We want to be able to import those directly, so + */ +export default new Namer({ + async name(opts): Promise { + const {bundle} = opts; + + const mainEntry = bundle.getMainEntry(); + if (!mainEntry) { + return null; + } + + // Get the relative file path within the source folder + const relativeDir = path.posix.relative('./src', path.dirname(mainEntry.filePath)); + + let filename; + if (bundle.type === 'js') { + // Rename generated JS files from FILE.js to FILE.TARGET.js or FILE.TARGET.js to fix naming conflict + // between CommonJS and ESM files + filename = path.basename(mainEntry.filePath, path.extname(mainEntry.filePath)); + filename += '.' + bundle.target.name + '.js'; + } else if (bundle.type === 'ts') { + filename = path.basename(mainEntry.filePath, path.extname(mainEntry.filePath)) + '.d.ts'; + } else { + filename = bundle.target.name + path.extname(mainEntry.filePath); + } + + const newPath = path.posix.join(relativeDir, filename); + + return newPath; + }, +}); diff --git a/webapp/platform/shared/setup_jest.ts b/webapp/platform/shared/setup_jest.ts new file mode 100644 index 00000000000..8ec9d636eb9 --- /dev/null +++ b/webapp/platform/shared/setup_jest.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import '@testing-library/jest-dom'; diff --git a/webapp/platform/shared/src/components/emoji/emoji.css b/webapp/platform/shared/src/components/emoji/emoji.css new file mode 100644 index 00000000000..cd8651484a8 --- /dev/null +++ b/webapp/platform/shared/src/components/emoji/emoji.css @@ -0,0 +1 @@ +/* The styles for this component are still defined in the web app */ diff --git a/webapp/platform/shared/src/components/emoji/emoji.test.tsx b/webapp/platform/shared/src/components/emoji/emoji.test.tsx new file mode 100644 index 00000000000..e7033cbd53e --- /dev/null +++ b/webapp/platform/shared/src/components/emoji/emoji.test.tsx @@ -0,0 +1,45 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {screen} from '@testing-library/react'; +import React from 'react'; + +import {Emoji} from './emoji'; + +import {renderWithContext} from '../../testing'; + +import '@testing-library/jest-dom'; + +describe('Emoji', () => { + test('should render nothing when no emoji name is provided', () => { + renderWithContext( + , + ); + + expect(document.querySelector('.emoticon')).not.toBeInTheDocument(); + }); + + test('should render the provided system emoji', () => { + renderWithContext( + , + ); + + expect(document.querySelector('.emoticon')).toBe(screen.getByLabelText(':smiley:')); + expect(screen.getByLabelText(':smiley:')).toBeInTheDocument(); + expect(screen.getByLabelText(':smiley:')).toHaveStyle({ + backgroundImage: 'https://mattermost.example.com/static/emoji/1F603.png', + }); + }); + + test('should render the provided custom emoji', () => { + renderWithContext( + , + ); + + expect(document.querySelector('.emoticon')).toBe(screen.getByLabelText(':custom-emoji-1:')); + expect(screen.getByLabelText(':custom-emoji-1:')).toBeInTheDocument(); + expect(screen.getByLabelText(':custom-emoji-1:')).toHaveStyle({ + backgroundImage: 'https://mattermost.example.com/api/v4/emojis/custom-emoji-id-1/image', + }); + }); +}); diff --git a/webapp/platform/shared/src/components/emoji/emoji.tsx b/webapp/platform/shared/src/components/emoji/emoji.tsx new file mode 100644 index 00000000000..de53fc604ef --- /dev/null +++ b/webapp/platform/shared/src/components/emoji/emoji.tsx @@ -0,0 +1,56 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import type {KeyboardEvent, MouseEvent} from 'react'; +import React from 'react'; + +import {useEmojiByName} from '../../context/useEmojiByName'; +import {useEmojiUrl} from '../../context/useEmojiUrl'; + +import './emoji.css'; + +const emptyEmojiStyle = {}; + +export interface EmojiProps { + emojiName: string; + size?: number; + emojiStyle?: React.CSSProperties; + + // TODO remove this prop and move the click handler a proper button + onClick?: (event: MouseEvent | KeyboardEvent) => void; +} + +export function Emoji({ + emojiName, + emojiStyle = emptyEmojiStyle, + size = 16, + onClick, +}: EmojiProps) { + const emoji = useEmojiByName(emojiName); + const emojiImageUrl = useEmojiUrl(emoji); + + if (!emoji || !emojiImageUrl) { + return null; + } + + return ( + + ); +} diff --git a/webapp/platform/shared/src/components/emoji/index.ts b/webapp/platform/shared/src/components/emoji/index.ts new file mode 100644 index 00000000000..5edbcf0d650 --- /dev/null +++ b/webapp/platform/shared/src/components/emoji/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {Emoji} from './emoji'; +export type {EmojiProps} from './emoji'; diff --git a/webapp/platform/shared/src/context/context.tsx b/webapp/platform/shared/src/context/context.tsx new file mode 100644 index 00000000000..740f7ddefb9 --- /dev/null +++ b/webapp/platform/shared/src/context/context.tsx @@ -0,0 +1,46 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useMemo} from 'react'; + +import type {Emoji} from '@mattermost/types/emojis'; + +/* eslint-disable no-underscore-dangle */ + +export interface SharedContextValue { + useEmojiByName: (name: string) => Emoji | undefined; + useEmojiUrl: (emoji?: Emoji) => string; +} + +declare global { + interface Window { + __MATTERMOST_SHARED_CONTEXT__: React.Context | undefined; + } +} + +// If multiple copies of the shared package happen to be loaded, this makes them share the same context. In practice, +// // this should never happen because the web app is supposed to provide the only copy of @mattermost/shared, +// but I borrowed the idea from React Intl. +export const SharedContext = window?.__MATTERMOST_SHARED_CONTEXT__ ?? ( + window.__MATTERMOST_SHARED_CONTEXT__ = React.createContext( + null as unknown as SharedContextValue, + ) +); +SharedContext.displayName = 'MattermostSharedContext'; + +export interface SharedProviderProps extends SharedContextValue { + children?: React.ReactNode; +} + +export function SharedProvider({ + children, + useEmojiByName, + useEmojiUrl, +}: SharedProviderProps) { + const contextValue = useMemo(() => ({ + useEmojiByName, + useEmojiUrl, + }), [useEmojiByName, useEmojiUrl]); + + return {children}; +} diff --git a/webapp/platform/shared/src/context/index.ts b/webapp/platform/shared/src/context/index.ts new file mode 100644 index 00000000000..3537982ffb2 --- /dev/null +++ b/webapp/platform/shared/src/context/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {SharedProvider} from './context'; +export type {SharedProviderProps} from './context'; diff --git a/webapp/platform/shared/src/context/useEmojiByName.ts b/webapp/platform/shared/src/context/useEmojiByName.ts new file mode 100644 index 00000000000..af99f547794 --- /dev/null +++ b/webapp/platform/shared/src/context/useEmojiByName.ts @@ -0,0 +1,12 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; + +import {SharedContext} from './context'; + +export function useEmojiByName(name: string) { + const context = React.useContext(SharedContext); + + return context.useEmojiByName(name); +} diff --git a/webapp/platform/shared/src/context/useEmojiUrl.ts b/webapp/platform/shared/src/context/useEmojiUrl.ts new file mode 100644 index 00000000000..e79da0df374 --- /dev/null +++ b/webapp/platform/shared/src/context/useEmojiUrl.ts @@ -0,0 +1,14 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React from 'react'; + +import type {Emoji} from '@mattermost/types/emojis'; + +import {SharedContext} from './context'; + +export function useEmojiUrl(emoji?: Emoji) { + const context = React.useContext(SharedContext); + + return context.useEmojiUrl(emoji); +} diff --git a/webapp/platform/shared/src/testing/index.ts b/webapp/platform/shared/src/testing/index.ts new file mode 100644 index 00000000000..3c7c6d254b5 --- /dev/null +++ b/webapp/platform/shared/src/testing/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export {renderHookWithContext, renderWithContext} from './react_testing_utils'; diff --git a/webapp/platform/shared/src/testing/react_testing_utils.tsx b/webapp/platform/shared/src/testing/react_testing_utils.tsx new file mode 100644 index 00000000000..d3f8f3f987b --- /dev/null +++ b/webapp/platform/shared/src/testing/react_testing_utils.tsx @@ -0,0 +1,112 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {render, renderHook} from '@testing-library/react'; +import React from 'react'; +import {IntlProvider} from 'react-intl'; + +import {useMockSharedContext} from './useMockSharedContext'; + +import type {SharedProviderProps} from '../context'; + +export type FullContextOptions = { + intlMessages?: Record; + locale?: string; + sharedContext?: Partial>; +} + +export const renderWithContext = ( + component: React.ReactElement, + + partialOptions?: FullContextOptions, +) => { + const options = { + intlMessages: partialOptions?.intlMessages, + locale: partialOptions?.locale ?? 'en', + sharedContext: partialOptions?.sharedContext, + }; + + // Store these in an object so that they can be maintained through rerenders + const renderState = { + component, + + options, + }; + + const results = render(component, { + wrapper: ({children}) => { + // Every time this is called, these values should be updated from `renderState` + return {children}; + }, + }); + + return { + ...results, + rerender: (newComponent: React.ReactElement) => { + renderState.component = newComponent; + + results.rerender(renderState.component); + }, + }; +}; + +export const renderHookWithContext = ( + callback: (props: TProps) => TResult, + + partialOptions?: FullContextOptions, +) => { + const options = { + intlMessages: partialOptions?.intlMessages, + locale: partialOptions?.locale ?? 'en', + sharedContext: partialOptions?.sharedContext, + }; + + // Store these in an object so that they can be maintained through rerenders + const renderState = { + callback, + options, + }; + + const results = renderHook(callback, { + wrapper: ({children}) => { + // Every time this is called, these values should be updated from `renderState` + return {children}; + }, + }); + + return { + ...results, + }; +}; + +type Opts = { + intlMessages: Record | undefined; + locale: string; + sharedContext?: Partial>; +} + +type RenderStateProps = { + children: React.ReactNode; + + options: Opts; +} + +// This should wrap the component in roughly the same providers used in App and RootProvider +const Providers = ({ + children, + + options, +}: RenderStateProps) => { + const {SharedContextProvider} = useMockSharedContext(options?.sharedContext ?? {}); + + return ( + + + {children} + + + ); +}; diff --git a/webapp/platform/shared/src/testing/useMockSharedContext.tsx b/webapp/platform/shared/src/testing/useMockSharedContext.tsx new file mode 100644 index 00000000000..c6d2a1ac090 --- /dev/null +++ b/webapp/platform/shared/src/testing/useMockSharedContext.tsx @@ -0,0 +1,68 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {useCallback, useMemo} from 'react'; + +import {isSystemEmoji, type CustomEmoji, type Emoji, type SystemEmoji} from '@mattermost/types/emojis'; + +import {SharedProvider, type SharedProviderProps} from '../context/context'; + +const mockEmojisByName = { + smiley: { + name: 'SMILING FACE WITH OPEN MOUTH', + unified: '1F603', + short_name: 'smiley', + short_names: [ + 'smiley', + ], + category: 'smileys-emotion', + } as SystemEmoji, + 'custom-emoji-1': { + id: 'custom-emoji-id-1', + name: 'custom-emoji-1', + category: 'custom', + create_at: 0, + update_at: 0, + delete_at: 0, + creator_id: 'user-id-1', + } as CustomEmoji, +}; + +export function useMockSharedContext({ + useEmojiByName, + useEmojiUrl, +}: Partial>) { + const propsWithOverrides = useMemo(() => { + return { + useEmojiByName: useEmojiByName ?? ((name: string) => { + if (!Object.hasOwn(mockEmojisByName, name)) { + return undefined; + } + + return mockEmojisByName[name as keyof typeof mockEmojisByName]; + }), + useEmojiUrl: useEmojiUrl ?? ((emoji?: Emoji) => { + // This doesn't 100% follow getEmojiImageUrl, but it's close enough for testing + if (!emoji) { + return ''; + } + + if (isSystemEmoji(emoji)) { + return `https://mattermost.example.com/static/emoji/${emoji.unified}.png`; + } + + return `https://mattermost.example.com/api/v4/emojis/${emoji.id}`; + }), + }; + }, [useEmojiByName, useEmojiUrl]); + + const SharedContextProvider = useCallback(({children}: Pick) => { + return ( + + {children} + + ); + }, [propsWithOverrides]); + + return {SharedContextProvider}; +} diff --git a/webapp/platform/shared/tsconfig.json b/webapp/platform/shared/tsconfig.json new file mode 100644 index 00000000000..9c880bcb7dc --- /dev/null +++ b/webapp/platform/shared/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "module": "es2022", + "moduleResolution": "bundler", + "target": "es2022", + "declaration": true, + "strict": true, + "resolveJsonModule": true, + "noEmit": true, + "isolatedModules": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "jsx": "react", + "rootDir": "./src", + "composite": true, + }, + "include": [ + "./src/**/*" + ], + "references": [ + {"path": "../types"} + ] +} diff --git a/webapp/platform/types/src/emojis.ts b/webapp/platform/types/src/emojis.ts index 11abd714af3..e5f47413406 100644 --- a/webapp/platform/types/src/emojis.ts +++ b/webapp/platform/types/src/emojis.ts @@ -28,10 +28,8 @@ export type CustomEmoji = { export type SystemEmoji = { name: string; category: EmojiCategory; - image: string; short_name: string; short_names: string[]; - batch: number; skins?: string[]; skin_variations?: Record; unified: string; @@ -63,3 +61,11 @@ export type RecentEmojiData = { name: string; usageCount: number; }; + +export function isSystemEmoji(emoji: Emoji): emoji is SystemEmoji { + if ('category' in emoji) { + return emoji.category !== 'custom'; + } + + return !('id' in emoji); +}