From 8bfae892cc2da440a50c0f891b5bb1e631cacf73 Mon Sep 17 00:00:00 2001 From: Matt Bowolick Date: Tue, 22 Oct 2024 14:53:34 +1100 Subject: [PATCH] 2024-10-22 --- .env => .env.template | 2 +- .github/workflows/ci.yml | 4 +- .github/workflows/package-lock-check.yml | 30 +- .gitignore | 11 +- .prettierrc | 21 + CHANGELOG.md | 69 +- README.md | 77 +- conf/eslint-general.mjs | 26 + conf/eslint-i18n.mjs | 21 +- eslint.config.mjs | 15 +- examples/app_image_elements/app.tsx | 12 +- examples/app_video_elements/app.tsx | 231 ++ examples/app_video_elements/index.tsx | 19 + examples/app_video_elements/package.json | 9 + examples/authentication/package.json | 4 +- examples/design_editing/app.tsx | 6 + examples/design_token/package.json | 2 +- examples/digital_asset_management/README.md | 13 +- .../digital_asset_management/package.json | 6 +- examples/drag_and_drop_image/app.tsx | 6 + examples/fetch/package.json | 2 +- examples/i18n/package.json | 2 +- examples/image_elements/app.tsx | 6 + examples/page_addition/app.tsx | 6 + examples/positioning_elements/app.tsx | 6 + examples/video_elements/app.tsx | 119 + examples/video_elements/index.tsx | 19 + examples/video_elements/package.json | 9 + package-lock.json | 1955 +++++++++-------- package.json | 51 +- scripts/copy-env.ts | 10 + tsconfig.json | 11 +- webpack.config.js | 10 +- 33 files changed, 1711 insertions(+), 1079 deletions(-) rename .env => .env.template (86%) create mode 100644 .prettierrc create mode 100644 examples/app_video_elements/app.tsx create mode 100644 examples/app_video_elements/index.tsx create mode 100644 examples/app_video_elements/package.json create mode 100644 examples/video_elements/app.tsx create mode 100644 examples/video_elements/index.tsx create mode 100644 examples/video_elements/package.json create mode 100644 scripts/copy-env.ts diff --git a/.env b/.env.template similarity index 86% rename from .env rename to .env.template index 12d876a8..ad32c954 100644 --- a/.env +++ b/.env.template @@ -3,4 +3,4 @@ CANVA_BACKEND_PORT=3001 CANVA_BACKEND_HOST=http://localhost:3001 # TODO: replace this with your production URL before submitting your app CANVA_APP_ID=# TODO: Add your app's ID here to configure your backend for JWT verification CANVA_APP_ORIGIN=# TODO: Add your app's origin here from the "Developer Portal -> Configure your app -> App Origin" to enable HMR -CANVA_HMR_ENABLED=FALSE # TODO: set to TRUE to enable HMR +CANVA_HMR_ENABLED=FALSE # TODO: set to TRUE to enable HMR diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6bb89dce..5f52b2b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,8 +3,6 @@ run-name: ${{ github.actor }} pushed a commit 🚀 on: pull_request: types: [opened, synchronize, reopened] - paths-ignore: - - 'internal/**' jobs: ci: @@ -15,7 +13,7 @@ jobs: - name: Set up node uses: actions/setup-node@v3 with: - node-version-file: '.nvmrc' + node-version-file: ".nvmrc" - name: NPM ci run: npm ci - name: npm run test diff --git a/.github/workflows/package-lock-check.yml b/.github/workflows/package-lock-check.yml index 6b2400f7..da5277ab 100644 --- a/.github/workflows/package-lock-check.yml +++ b/.github/workflows/package-lock-check.yml @@ -3,28 +3,26 @@ run-name: ${{ github.actor }} pushed a commit 🚀 on: pull_request: types: [opened, synchronize, reopened] - paths-ignore: - - 'internal/**' jobs: check-package-lock: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v3 + - name: Checkout code + uses: actions/checkout@v3 - - name: Install Node.js and NPM - uses: actions/setup-node@v3 - with: - node-version-file: '.nvmrc' + - name: Install Node.js and NPM + uses: actions/setup-node@v3 + with: + node-version-file: ".nvmrc" - - name: Install NPM packages - run: npm install + - name: Install NPM packages + run: npm install - - name: Check for package-lock.json changes - run: | - if git diff --name-only | grep --quiet 'package-lock.json'; then - echo "::error::Please run 'npm install' before committing your changes and make sure package-lock.json is up to date." - exit 1 - fi + - name: Check for package-lock.json changes + run: | + if git diff --name-only | grep --quiet 'package-lock.json'; then + echo "::error::Please run 'npm install' before committing your changes and make sure package-lock.json is up to date." + exit 1 + fi diff --git a/.gitignore b/.gitignore index 1228cb24..0f790ccf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ +.DS_Store +.env .idea .ssl -node_modules -.DS_Store -.pr-train.yml -yarn-error.log -dist -secrets.json +*.log* **/*/db.json +dist +node_modules diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..d694c039 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,21 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "singleAttributePerLine": false, + "bracketSameLine": false, + "jsxSingleQuote": false, + "printWidth": 80, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": false, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "embeddedLanguageFormatting": "auto", + "experimentalTernaries": false +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 684cebe3..e918225e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,70 @@ # Changelog +## 2024-10-22 + +### 🧰 Added + +- `examples` + - Added an example to demonstrate [adding videos](https://www.canva.dev/docs/apps/creating-videos/) in `examples/video_elements`. + - Added an example to demonstrate [adding an app-controlled videos](https://www.canva.dev/docs/apps/creating-app-elements/) in `examples/app_video_elements`. +- Added a `.prettierrc` config file to introduce some consistency across the Starter Kit repo, for developers who have forked this repo for their own projects are welcome to adjust to their own liking and preferences. +- `eslint` + + - Added arguments to the `formatjs/no-literal-string-in-jsx` rule to include App UI Kit props that should be localized (e.g. ariaLabel now is highlighted if developers are not using the recommend `react-intl` messaging pattern). + + ```jsx + // ❌ Not recommended, messages will not be localized. + + // ~~~~~~~~~~~~~~~~~~~~ + // error: Cannot have untranslated text in JSX eslintformatjs/no-literal-string-in-jsx + + + // ✅ Recommended, messages will be localized. + const intl = useIntl(); + + ``` + + - Added a new rule to lint against inlining large assets, such as videos, images or audio in apps, which leads to larger and slower apps. + +### 🐞 Fixed + +- Fixed an issue where running `npm start` on an Ubuntu system would result in `Error: Cannot find module '@ngrok/ngrok-linux-x64-gnu`. +- Fixed an issue where running `npm run extract` on Windows systems would generate an empty `messages_en.json` ([Github issue](https://github.com/formatjs/formatjs/issues/3854)). + +### 🔧 Changed + +- `@canva/app-i18n-kit` + - Upgraded `app-i18n-kit` to version `1.0.0`. +- `@canva/app-ui-kit` + - Upgraded `app-ui-kit` to version `4.1.0`. Please see the [changelog](https://www.canva.dev/docs/apps/app-ui-kit/changelog/) for the list of changes. +- Added instructions to the [README](README.md) for running an example. +- Dependencies audit, upgrading all modules where possible: + + ```text + @eslint/js 9.9.0 → 9.12.0 + @testing-library/react 16.0.0 → 16.0.1 + @types/jest 29.5.12 → 29.5.13 + @types/jsonwebtoken 9.0.6 → 9.0.7 + @types/react 18.3.4 → 18.3.11 + @types/react-dom 18.0.11 → 18.3.1 + @typescript-eslint/eslint-plugin 8.2.0 → 8.9.0 + @typescript-eslint/parser 8.2.0 → 8.9.0 + cssnano 7.0.5 → 7.0.6 + debug 4.3.6 → 4.3.7 + eslint 8.57.1 → 9.12.0 + eslint-plugin-formatjs 4.13.3 → 5.0.0 + eslint-plugin-jest 28.8.0 → 28.8.3 + eslint-plugin-react 7.35.0 → 7.37.1 + express 4.21.0 → 4.21.1 + globals 15.9.0 → 15.11.0 + ts-jest 29.2.4 → 29.2.5 + webpack 5.94.0 → 5.95.0 + webpack-dev-server 5.0.4 → 5.1.0 + ``` + +- Moved `.env` to a `.env.template` and added to the `.gitignore`, a postinstall script now copies this locally. +- Other minor improvements, cleanup and fixes of stale config. + ## 2024-09-25 ### 🔨 Breaking changes @@ -154,7 +219,7 @@ - Removed `/sdk/preview`, as all of our preview SDKs are now published to NPM with an `@beta` tag. e.g. to install the preview `@canva/design` SDK, run the following command - ``` + ```bash npm install @canva/design@beta ``` @@ -560,7 +625,7 @@ - Run the below command at the repo root to upgrade via [nvm](https://github.com/nvm-sh/nvm#intro) - ``` + ```bash nvm install ``` diff --git a/README.md b/README.md index 244e3bf3..a9b948e3 100644 --- a/README.md +++ b/README.md @@ -66,7 +66,7 @@ To enable HMR: 5. Set the `CANVA_APP_ORIGIN` environment variable to the value copied from the **App origin** field: ```bash - CANVA_APP_ORIGIN=# YOUR APP ORIGIN GOES HERE + CANVA_APP_ORIGIN=# YOUR APP ORIGIN GOES HERE ``` 6. Set the `CANVA_HMR_ENABLED` environment variable to `true`: @@ -81,38 +81,73 @@ To enable HMR:
Previewing apps in Safari - By default, the development server is not HTTPS-enabled. This is convenient, as there's no need for a security certificate, but it prevents apps from being previewed in Safari. +By default, the development server is not HTTPS-enabled. This is convenient, as there's no need for a security certificate, but it prevents apps from being previewed in Safari. - **Why Safari requires the development server to be HTTPS-enabled?** +**Why Safari requires the development server to be HTTPS-enabled?** - Canva itself is served via HTTPS and most browsers prevent HTTPS pages from loading scripts via non-HTTPS connections. Chrome and Firefox make exceptions for local servers, such as `localhost`, but Safari does not, so if you're using Safari, the development server must be HTTPS-enabled. +Canva itself is served via HTTPS and most browsers prevent HTTPS pages from loading scripts via non-HTTPS connections. Chrome and Firefox make exceptions for local servers, such as `localhost`, but Safari does not, so if you're using Safari, the development server must be HTTPS-enabled. - To learn more, see [Loading mixed-content resources](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content#loading_mixed-content_resources). +To learn more, see [Loading mixed-content resources](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content#loading_mixed-content_resources). - To preview apps in Safari: +To preview apps in Safari: - 1. Start the development server with HTTPS enabled: +1. Start the development server with HTTPS enabled: - ```bash - # Run the main app - npm start --use-https +```bash +# Run the main app +npm start --use-https - # Run an example - npm start --use-https - ``` +# Run an example +npm start --use-https +``` - 2. Navigate to . - 3. Bypass the invalid security certificate warning: - 1. Click **Show details**. - 2. Click **Visit website**. - 4. In the Developer Portal, set the app's **Development URL** to . - 5. Click preview (or refresh your app if it's already open). +2. Navigate to . +3. Bypass the invalid security certificate warning: + 1. Click **Show details**. + 2. Click **Visit website**. +4. In the Developer Portal, set the app's **Development URL** to . +5. Click preview (or refresh your app if it's already open). - You need to bypass the invalid security certificate warning every time you start the local server. A similar warning will appear in other browsers (and will need to be bypassed) whenever HTTPS is enabled. +You need to bypass the invalid security certificate warning every time you start the local server. A similar warning will appear in other browsers (and will need to be bypassed) whenever HTTPS is enabled. + +**Note**: If you are running your server on HTTPS (such as for testing on Safari) be sure to change the `CANVA_BACKEND_HOST` environment variable to `https://localhost:3001`. - **Note**: If you are running your server on HTTPS (such as for testing on Safari) be sure to change the `CANVA_BACKEND_HOST` environment variable to `https://localhost:3001`.
+## Running an example + +The `examples` folder contains demonstration apps for a variety of Canva APIs. + +To see a list of all example apps, run the following command: + +```bash +npm start examples +``` + +You can use arrow keys to navigate the list and press enter to run a specific example. It will look something like this: + +```bash + npm start examples + + ? Which example would you like to run? › + ❯ app element children + app embed elements + app image elements + app shape elements + app text elements + asset upload + authentication + color + design editing + ↓ design token +``` + +To start a specific example app, run the following command: + +```bash +npm start +``` + ## Running an example's backend Some examples have a backend. This backend is defined in the example's `backend/server.ts` file, automatically starts when the `npm start` command is run, and becomes available at . diff --git a/conf/eslint-general.mjs b/conf/eslint-general.mjs index 8832cc26..b5f2e7f3 100644 --- a/conf/eslint-general.mjs +++ b/conf/eslint-general.mjs @@ -179,6 +179,32 @@ export default [ "Apps are currently not allowed to open popups, or new tabs via browser APIs. Please use `requestOpenExternalUrl` from `@canva/platform` to link to external URLs. To learn more, see https://www.canva.dev/docs/apps/api/platform-request-open-external-url/", }, ], + "no-restricted-imports": [ + "warn", + { + // Warn when importing static assets that increase bundle size + patterns: [ + // Images + { + group: ["*.png", "*.jpg", "*.jpeg", "*.gif"], + message: + "Inline images increase app bundle size and degrade app performance. Wherever possible, please use a CDN or external hosting service to dynamically load assets.", + }, + // Videos + { + group: ["*.mp4", "*.webm", "*.ogg"], + message: + "Inline videos increase app bundle size and degrade app performance. Wherever possible, please use a CDN or external hosting service to dynamically load assets.", + }, + // Audio + { + group: ["*.mp3", "*.wav", "*.ogg"], + message: + "Inline audio files increase app bundle size and degrade app performance. Wherever possible, please use a CDN or external hosting service to dynamically load assets.", + }, + ], + }, + ], "no-return-await": "error", "no-throw-literal": "error", "no-undef-init": "error", diff --git a/conf/eslint-i18n.mjs b/conf/eslint-i18n.mjs index acbcde7b..a2c048b0 100644 --- a/conf/eslint-i18n.mjs +++ b/conf/eslint-i18n.mjs @@ -7,7 +7,22 @@ export default [ }, rules: { "formatjs/no-invalid-icu": "error", - "formatjs/no-literal-string-in-jsx": "error", + "formatjs/no-literal-string-in-jsx": [ + 2, + { + props: { + // These rules are for @canva/app-ui-kit components. + // For your own components, suppress any false positives using eslint ignore comments. + include: [ + ["*", "(*Label|label|alt)"], + ["*", "(title|description|name|text)"], + ["*", "(placeholder|additionalPlaceholder|defaultValue)"], + ["FormField", "error"], + ], + exclude: [["FormattedMessage", "description"]], + }, + }, + ], "formatjs/enforce-description": "error", "formatjs/enforce-default-message": "error", "formatjs/enforce-placeholders": "error", @@ -18,6 +33,6 @@ export default [ "formatjs/no-offset": "error", "formatjs/blocklist-elements": [2, ["selectordinal"]], "formatjs/no-complex-selectors": "error", - } - } + }, + }, ]; diff --git a/eslint.config.mjs b/eslint.config.mjs index 739dc999..3975b1d9 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -20,8 +20,6 @@ export default [ "**/dist", "**/*.d.ts", "**/*.d.tsx", - "**/sdk", - "**/internal", "**/*.config.*", ], }, @@ -32,12 +30,17 @@ export default [ "plugin:@typescript-eslint/strict", "plugin:@typescript-eslint/stylistic", "plugin:react/recommended", - "plugin:jest/recommended" + "plugin:jest/recommended", ), ...general, - ...i18n.map(config => ({ + ...i18n.map((config) => ({ ...config, - files: ["src/**/*", "examples/i18n/**/*", "cli/common/templates/gen_ai/**/*", "cli/common/templates/hello_world/**/*"], + files: [ + "src/**/*", + // Currently only the 'i18n' example is localized and following the + // formatjs guidelines. If more examples are localized, this list + // should be updated: + "examples/i18n/**/*", + ], })), - ]; diff --git a/examples/app_image_elements/app.tsx b/examples/app_image_elements/app.tsx index e71c3a28..b4d0353e 100644 --- a/examples/app_image_elements/app.tsx +++ b/examples/app_image_elements/app.tsx @@ -1,3 +1,9 @@ +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable no-restricted-imports */ import { Box, Button, @@ -164,7 +170,7 @@ export const App = () => { setState((prevState) => { return { ...prevState, - width: Number(value || 0), + width: value || 0, }; }); }} @@ -182,7 +188,7 @@ export const App = () => { setState((prevState) => { return { ...prevState, - height: Number(value || 0), + height: value || 0, }; }); }} @@ -201,7 +207,7 @@ export const App = () => { setState((prevState) => { return { ...prevState, - rotation: Number(value || 0), + rotation: value || 0, }; }); }} diff --git a/examples/app_video_elements/app.tsx b/examples/app_video_elements/app.tsx new file mode 100644 index 00000000..e0f80042 --- /dev/null +++ b/examples/app_video_elements/app.tsx @@ -0,0 +1,231 @@ +import { + Box, + Button, + FormField, + Grid, + VideoCard, + NumberInput, + Rows, + Text, +} from "@canva/app-ui-kit"; +import { initAppElement } from "@canva/design"; +import React from "react"; +import * as styles from "styles/components.css"; +import { upload } from "@canva/asset"; + +type AppElementData = { + title: string; + videoId: string; + width: number; + height: number; + rotation: number; +}; + +type UIState = AppElementData; + +const videos = { + building: { + title: "Pinwheel on building", + url: "https://www.canva.dev/example-assets/video-import/video.mp4", + thumbnailImageUrl: + "https://www.canva.dev/example-assets/video-import/thumbnail-image.jpg", + thumbnailVideoUrl: + "https://www.canva.dev/example-assets/video-import/thumbnail-video.mp4", + width: 405, + height: 720, + videoRef: undefined, + }, + beach: { + title: "A beautiful beach scene", + url: "https://www.canva.dev/example-assets/video-import/beach-video.mp4", + thumbnailImageUrl: + "https://www.canva.dev/example-assets/video-import/beach-thumbnail-image.jpg", + thumbnailVideoUrl: + "https://www.canva.dev/example-assets/video-import/beach-thumbnail-video.mp4", + width: 320, + height: 180, + videoRef: undefined, + }, +}; + +const initialState: UIState = { + title: "Pinwheel on building", + videoId: "building", + width: 405, + height: 720, + rotation: 0, +}; + +const appElementClient = initAppElement({ + render: (data) => { + return [ + { + type: "video", + top: 0, + left: 0, + altText: { + text: `a video of ${data.title}`, + decorative: undefined, + }, + ref: videos[data.videoId].videoRef, + ...data, + }, + ]; + }, +}); + +export const App = () => { + const [loading, setLoading] = React.useState(false); + const [state, setState] = React.useState(initialState); + const { videoId, width, height, rotation } = state; + const disabled = loading || !videoId || videoId.trim().length < 1; + + const items = Object.entries(videos).map(([key, value]) => { + const { title, thumbnailImageUrl, thumbnailVideoUrl, width, height } = + value; + return { + key, + title, + thumbnailImageUrl, + thumbnailVideoUrl, + active: videoId === key, + onClick: () => { + setState((prevState) => { + return { + ...prevState, + videoId: key, + width, + height, + }; + }); + }, + }; + }); + + const addOrUpdateVideo = React.useCallback(async () => { + setLoading(true); + try { + if (!videos[state.videoId].videoRef) { + const item = videos[state.videoId]; + const { ref } = await upload({ + type: "video", + mimeType: "video/mp4", + url: item.url, + thumbnailImageUrl: item.thumbnailImageUrl, + thumbnailVideoUrl: item.thumbnailVideoUrl, + aiDisclosure: "none", + }); + videos[state.videoId].videoRef = ref; + } + + // Add or update app element + await appElementClient.addOrUpdateElement(state); + } finally { + setLoading(false); + } + }, [state]); + + React.useEffect(() => { + appElementClient.registerOnElementChange((appElement) => { + setState(appElement ? appElement.data : initialState); + }); + }, []); + + return ( +
+ + + This example demonstrates how apps can create video elements inside + app elements. This makes the element re-editable and lets apps control + additional properties, such as the width and height. + + ( + + + {items.map((item) => ( + + ))} + + + )} + /> + ( + { + setState((prevState) => { + return { + ...prevState, + width: value || 0, + }; + }); + }} + /> + )} + /> + ( + { + setState((prevState) => { + return { + ...prevState, + height: value || 0, + }; + }); + }} + /> + )} + /> + ( + { + setState((prevState) => { + return { + ...prevState, + rotation: value || 0, + }; + }); + }} + /> + )} + /> + + +
+ ); +}; diff --git a/examples/app_video_elements/index.tsx b/examples/app_video_elements/index.tsx new file mode 100644 index 00000000..48fd52e6 --- /dev/null +++ b/examples/app_video_elements/index.tsx @@ -0,0 +1,19 @@ +import { AppUiProvider } from "@canva/app-ui-kit"; +import { createRoot } from "react-dom/client"; +import { App } from "./app"; +import "@canva/app-ui-kit/styles.css"; + +const root = createRoot(document.getElementById("root") as Element); +function render() { + root.render( + + + , + ); +} + +render(); + +if (module.hot) { + module.hot.accept("./app", render); +} diff --git a/examples/app_video_elements/package.json b/examples/app_video_elements/package.json new file mode 100644 index 00000000..26c4a534 --- /dev/null +++ b/examples/app_video_elements/package.json @@ -0,0 +1,9 @@ +{ + "name": "app_video_elements", + "description": "An example app demonstrating how to create video elements inside app elements.", + "author": "Canva Pty Ltd.", + "license": "Please refer to the LICENSE.md file in the root directory", + "dependencies": { + "clsx": "2.1.1" + } +} diff --git a/examples/authentication/package.json b/examples/authentication/package.json index ca12661a..56c8d4de 100644 --- a/examples/authentication/package.json +++ b/examples/authentication/package.json @@ -4,9 +4,9 @@ "author": "Canva Pty Ltd.", "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", - "express": "4.21.0", + "express": "4.21.1", "express-basic-auth": "1.2.1" }, "devDependencies": { diff --git a/examples/design_editing/app.tsx b/examples/design_editing/app.tsx index be4db1f5..c3e1c230 100644 --- a/examples/design_editing/app.tsx +++ b/examples/design_editing/app.tsx @@ -1,3 +1,9 @@ +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable no-restricted-imports */ import { Button, Rows, Text } from "@canva/app-ui-kit"; import { upload } from "@canva/asset"; import type { DesignEditing } from "@canva/design"; diff --git a/examples/design_token/package.json b/examples/design_token/package.json index 8d7de5f8..58ad322f 100644 --- a/examples/design_token/package.json +++ b/examples/design_token/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "cors": "2.8.5", - "express": "4.21.0", + "express": "4.21.1", "jsonwebtoken": "9.0.2", "jwks-rsa": "3.1.0" } diff --git a/examples/digital_asset_management/README.md b/examples/digital_asset_management/README.md index 8e6ffea5..7675eea2 100644 --- a/examples/digital_asset_management/README.md +++ b/examples/digital_asset_management/README.md @@ -25,9 +25,9 @@ This will launch one development server for the frontend and backend -2. Navigate to your app at `https://www.canva.com/developers/apps`, and click **Preview** to preview the app. +1. Navigate to your app at `https://www.canva.com/developers/apps`, and click **Preview** to preview the app. -3. If your app requires authentication with a third party service, continue to Step 3. +1. If your app requires authentication with a third party service, continue to Step 3. Otherwise, you can make requests to your service via [./backend/server.ts](./backend/server.ts) inside `"/resources/find"`. ## Step 3: (optional) Configure ngrok @@ -72,6 +72,7 @@ From the `canva-apps-sdk-starter-kit` directory 2. After ngrok is running, copy your ngrok url (e.g. ) to the clipboard. + 1. Go to your app in the [Developer Portal](https://www.canva.com/developers/apps). 2. Navigate to the "Add authentication" section of your app. 3. Check "This app requires authentication" @@ -83,11 +84,12 @@ From the `canva-apps-sdk-starter-kit` directory date to ensure your example authentication step will run. 3. Make sure the app is authenticating users by making the following changes: + 1. Replace `router.post("/resources/find", async (req, res) => {` - with + with `router.post("/api/resources/find", async (req, res) => {` @@ -96,11 +98,11 @@ From the `canva-apps-sdk-starter-kit` directory 2. Replace - ```const url = new URL(`${BACKEND_HOST}/resources/find`);``` + ``const url = new URL(`${BACKEND_HOST}/resources/find`);`` with - ```const url = new URL(`${BACKEND_HOST}/api/resources/find`);``` + ``const url = new URL(`${BACKEND_HOST}/api/resources/find`);`` in [./adapter.ts](./adapter.ts) @@ -112,6 +114,7 @@ From the `canva-apps-sdk-starter-kit` directory ``` 4. Navigate to your app at `https://www.canva.com/developers/apps`, and click **Preview** to preview the app. + 1. A new screen will appear asking if you want to authenticate. Press **Connect** to start the authentication flow. 2. A ngrok screen may appear. If it does, select **Visit Site** diff --git a/examples/digital_asset_management/package.json b/examples/digital_asset_management/package.json index f26f8651..5dd1304c 100644 --- a/examples/digital_asset_management/package.json +++ b/examples/digital_asset_management/package.json @@ -4,10 +4,10 @@ "author": "Canva Pty Ltd.", "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { - "@canva/app-components": "^1.0.0-beta.28", - "cookie-parser": "1.4.6", + "@canva/app-components": "^1.0.0-beta.29", + "cookie-parser": "1.4.7", "cors": "2.8.5", - "express": "4.21.0" + "express": "4.21.1" }, "devDependencies": { "@types/cors": "2.8.17" diff --git a/examples/drag_and_drop_image/app.tsx b/examples/drag_and_drop_image/app.tsx index f80df592..552c1e09 100644 --- a/examples/drag_and_drop_image/app.tsx +++ b/examples/drag_and_drop_image/app.tsx @@ -3,6 +3,12 @@ import { Rows, Text, Title, ImageCard } from "@canva/app-ui-kit"; import { upload } from "@canva/asset"; import type { ImageDragConfig } from "@canva/design"; import { ui } from "@canva/design"; +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable-next-line no-restricted-imports */ import dog from "assets/images/dog.jpg"; import * as styles from "styles/components.css"; import { useFeatureSupport } from "utils/use_feature_support"; diff --git a/examples/fetch/package.json b/examples/fetch/package.json index f47e8c41..159e3598 100644 --- a/examples/fetch/package.json +++ b/examples/fetch/package.json @@ -6,7 +6,7 @@ "dependencies": { "cors": "2.8.5", "dotenv": "16.4.5", - "express": "4.21.0" + "express": "4.21.1" }, "devDependencies": { "@types/cors": "2.8.17" diff --git a/examples/i18n/package.json b/examples/i18n/package.json index c2edb6ac..cdaa630c 100644 --- a/examples/i18n/package.json +++ b/examples/i18n/package.json @@ -4,7 +4,7 @@ "author": "Canva Pty Ltd.", "license": "Please refer to the LICENSE.md file in the root directory", "scripts": { - "extract": "formatjs extract '**/*.{ts,tsx}' --out-file dist/messages_en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'", + "extract": "formatjs extract **/*.{ts,tsx} --out-file dist/messages_en.json --id-interpolation-pattern '[sha512:contenthash:base64:6]'", "test": "jest --no-cache --config='../../jest.config.js'", "test:watch": "jest --no-cache --watch --config='../../jest.config.js'", "test:update": "npm run test -- -u" diff --git a/examples/image_elements/app.tsx b/examples/image_elements/app.tsx index e059cc79..2197c98e 100644 --- a/examples/image_elements/app.tsx +++ b/examples/image_elements/app.tsx @@ -1,3 +1,9 @@ +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable no-restricted-imports */ import { Box, Button, diff --git a/examples/page_addition/app.tsx b/examples/page_addition/app.tsx index 5946edad..62a8f051 100644 --- a/examples/page_addition/app.tsx +++ b/examples/page_addition/app.tsx @@ -2,6 +2,12 @@ import { Alert, Button, Rows, Text } from "@canva/app-ui-kit"; import type { Dimensions, EmbedElement, GroupElement } from "@canva/design"; import { addPage, getDefaultPageDimensions } from "@canva/design"; import { CanvaError } from "@canva/error"; +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable-next-line no-restricted-imports */ import weather from "assets/images/weather.png"; import { useState, useEffect } from "react"; import * as styles from "styles/components.css"; diff --git a/examples/positioning_elements/app.tsx b/examples/positioning_elements/app.tsx index 94aeb13a..4099cf79 100644 --- a/examples/positioning_elements/app.tsx +++ b/examples/positioning_elements/app.tsx @@ -1,3 +1,9 @@ +/** + * Static images are used here for demonstration purposes only. + * In a real app, you should use a CDN/hosting service to host your images, + * then upload them to Canva using the `upload` function from the `@canva/asset` package. + */ +/* eslint-disable no-restricted-imports */ import { Alert, Box, diff --git a/examples/video_elements/app.tsx b/examples/video_elements/app.tsx new file mode 100644 index 00000000..1eb6d48b --- /dev/null +++ b/examples/video_elements/app.tsx @@ -0,0 +1,119 @@ +import { + Box, + Button, + FormField, + Grid, + VideoCard, + Rows, + Text, +} from "@canva/app-ui-kit"; +import React from "react"; +import * as styles from "styles/components.css"; +import { upload } from "@canva/asset"; +import { useAddElement } from "utils/use_add_element"; + +const videos = { + building: { + title: "Pinwheel on building", + url: "https://www.canva.dev/example-assets/video-import/video.mp4", + thumbnailImageUrl: + "https://www.canva.dev/example-assets/video-import/thumbnail-image.jpg", + thumbnailVideoUrl: + "https://www.canva.dev/example-assets/video-import/thumbnail-video.mp4", + }, + beach: { + title: "A beautiful beach scene", + url: "https://www.canva.dev/example-assets/video-import/beach-video.mp4", + thumbnailImageUrl: + "https://www.canva.dev/example-assets/video-import/beach-thumbnail-image.jpg", + thumbnailVideoUrl: + "https://www.canva.dev/example-assets/video-import/beach-thumbnail-video.mp4", + }, +}; + +export const App = () => { + const [selected, setSelected] = React.useState("building"); + const [isLoading, setIsLoading] = React.useState(false); + const addElement = useAddElement(); + + const items = Object.entries(videos).map(([key, value]) => { + const { title, thumbnailImageUrl, thumbnailVideoUrl } = value; + return { + key, + title, + thumbnailImageUrl, + thumbnailVideoUrl, + active: selected === key, + onClick: () => { + setSelected(key); + }, + }; + }); + + const addVideo = React.useCallback(async () => { + setIsLoading(true); + try { + const item = videos[selected]; + const { ref } = await upload({ + type: "video", + mimeType: "video/mp4", + url: item.url, + thumbnailImageUrl: item.thumbnailImageUrl, + thumbnailVideoUrl: item.thumbnailVideoUrl, + aiDisclosure: "none", + }); + + await addElement({ + type: "video", + ref, + altText: { + text: item.title, + decorative: undefined, + }, + }); + } finally { + setIsLoading(false); + } + }, [selected]); + + return ( +
+ + + This example demonstrates how apps can add video elements to a design. + + ( + + + {items.map((item) => ( + + ))} + + + )} + /> + + +
+ ); +}; diff --git a/examples/video_elements/index.tsx b/examples/video_elements/index.tsx new file mode 100644 index 00000000..48fd52e6 --- /dev/null +++ b/examples/video_elements/index.tsx @@ -0,0 +1,19 @@ +import { AppUiProvider } from "@canva/app-ui-kit"; +import { createRoot } from "react-dom/client"; +import { App } from "./app"; +import "@canva/app-ui-kit/styles.css"; + +const root = createRoot(document.getElementById("root") as Element); +function render() { + root.render( + + + , + ); +} + +render(); + +if (module.hot) { + module.hot.accept("./app", render); +} diff --git a/examples/video_elements/package.json b/examples/video_elements/package.json new file mode 100644 index 00000000..90e33a16 --- /dev/null +++ b/examples/video_elements/package.json @@ -0,0 +1,9 @@ +{ + "name": "video_elements", + "description": "An example app demonstrating how apps can add video elements to a design.", + "author": "Canva Pty Ltd.", + "license": "Please refer to the LICENSE.md file in the root directory", + "dependencies": { + "clsx": "2.1.1" + } +} diff --git a/package-lock.json b/package-lock.json index fbda268e..ff194da4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,13 +5,14 @@ "packages": { "": { "name": "canva-apps-sdk-starter-kit", + "hasInstallScript": true, "license": "SEE LICENSE IN LICENSE.md", "workspaces": [ "./examples/*" ], "dependencies": { - "@canva/app-i18n-kit": "^0.0.1-beta.5", - "@canva/app-ui-kit": "^4.0.0", + "@canva/app-i18n-kit": "^1.0.0", + "@canva/app-ui-kit": "^4.1.0", "@canva/asset": "^2.0.0", "@canva/design": "^2.1.0", "@canva/error": "^2.0.0", @@ -23,42 +24,42 @@ }, "devDependencies": { "@eslint/eslintrc": "3.1.0", - "@eslint/js": "9.9.0", + "@eslint/js": "9.12.0", "@formatjs/cli": "6.2.12", "@formatjs/ts-transformer": "3.13.14", "@ngrok/ngrok": "1.4.1", "@svgr/webpack": "8.1.0", "@testing-library/dom": "10.4.0", - "@testing-library/react": "16.0.0", + "@testing-library/react": "16.0.1", "@types/debug": "4.1.12", "@types/express": "4.17.21", - "@types/jest": "29.5.12", - "@types/jsonwebtoken": "9.0.6", + "@types/jest": "29.5.13", + "@types/jsonwebtoken": "9.0.7", "@types/node": "20.10.0", "@types/node-fetch": "2.6.11", "@types/node-forge": "1.3.11", "@types/nodemon": "1.19.6", "@types/prompts": "2.4.9", - "@types/react": "18.3.4", - "@types/react-dom": "18.3.0", + "@types/react": "18.3.11", + "@types/react-dom": "18.3.1", "@types/webpack-env": "1.18.5", - "@typescript-eslint/eslint-plugin": "8.2.0", - "@typescript-eslint/parser": "8.2.0", + "@typescript-eslint/eslint-plugin": "8.9.0", + "@typescript-eslint/parser": "8.9.0", "chalk": "4.1.2", "cli-table3": "0.6.5", "css-loader": "7.1.2", "css-modules-typescript-loader": "4.0.1", - "cssnano": "7.0.5", - "debug": "4.3.6", + "cssnano": "7.0.6", + "debug": "4.3.7", "dotenv": "16.4.5", - "eslint": "8.57.1", - "eslint-plugin-formatjs": "4.13.3", - "eslint-plugin-jest": "28.8.0", - "eslint-plugin-react": "7.35.0", + "eslint": "9.12.0", + "eslint-plugin-formatjs": "5.0.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-react": "7.37.1", "exponential-backoff": "3.1.1", - "express": "4.21.0", + "express": "4.21.1", "express-basic-auth": "1.2.1", - "globals": "15.9.0", + "globals": "15.11.0", "jest": "29.7.0", "jest-css-modules-transform": "4.4.2", "jest-environment-jsdom": "29.7.0", @@ -73,14 +74,14 @@ "prompts": "2.4.2", "style-loader": "4.0.0", "terser-webpack-plugin": "5.3.10", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-loader": "9.5.1", "ts-node": "10.9.2", "typescript": "5.5.4", "url-loader": "4.1.1", - "webpack": "5.94.0", + "webpack": "5.95.0", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.0.4", + "webpack-dev-server": "5.1.0", "yargs": "17.7.2" }, "engines": { @@ -88,6 +89,15 @@ "npm": "^9 || ^10" } }, + "../sdk/experimental": { + "name": "@canva/experimental", + "version": "0.8.0", + "extraneous": true, + "license": "SEE LICENSE IN LICENSE.md", + "peerDependencies": { + "@canva/error": "^2.0.0" + } + }, "examples/app_element_children": { "license": "Please refer to the LICENSE.md file in the root directory" }, @@ -106,15 +116,21 @@ "examples/app_text_elements": { "license": "Please refer to the LICENSE.md file in the root directory" }, + "examples/app_video_elements": { + "license": "Please refer to the LICENSE.md file in the root directory", + "dependencies": { + "clsx": "2.1.1" + } + }, "examples/asset_upload": { "license": "Please refer to the LICENSE.md file in the root directory" }, "examples/authentication": { "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { - "cookie-parser": "1.4.6", + "cookie-parser": "1.4.7", "cors": "2.8.5", - "express": "4.21.0", + "express": "4.21.1", "express-basic-auth": "1.2.1" }, "devDependencies": { @@ -139,6 +155,7 @@ "version": "2.2.0-beta.1", "resolved": "https://registry.npmjs.org/@canva/design/-/design-2.2.0-beta.1.tgz", "integrity": "sha512-OWSLXASC0DvRVj9CCR1RD20JEmGHFaEcyy5WtTic/5O2UXD6p15+XmxbheqCW/wFEPLLOo+GrCM8jSOeMP/oDA==", + "license": "SEE LICENSE IN LICENSE.md FILE", "peerDependencies": { "@canva/error": "^2.0.0" } @@ -147,7 +164,7 @@ "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { "cors": "2.8.5", - "express": "4.21.0", + "express": "4.21.1", "jsonwebtoken": "9.0.2", "jwks-rsa": "3.1.0" }, @@ -158,10 +175,10 @@ "examples/digital_asset_management": { "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { - "@canva/app-components": "^1.0.0-beta.28", - "cookie-parser": "1.4.6", + "@canva/app-components": "^1.0.0-beta.29", + "cookie-parser": "1.4.7", "cors": "2.8.5", - "express": "4.21.0" + "express": "4.21.1" }, "devDependencies": { "@types/cors": "2.8.17" @@ -196,7 +213,7 @@ "dependencies": { "cors": "2.8.5", "dotenv": "16.4.5", - "express": "4.21.0" + "express": "4.21.1" }, "devDependencies": { "@types/cors": "2.8.17" @@ -267,6 +284,13 @@ "extraneous": true, "license": "Please refer to the LICENSE.md file in the root directory" }, + "examples/native_video_elements": { + "extraneous": true, + "license": "Please refer to the LICENSE.md file in the root directory", + "dependencies": { + "clsx": "^2.1.0" + } + }, "examples/open_external_link": { "license": "Please refer to the LICENSE.md file in the root directory" }, @@ -298,7 +322,7 @@ "extraneous": true, "license": "Please refer to the LICENSE.md file in the root directory", "dependencies": { - "clsx": "^2.1.1" + "clsx": "2.1.1" } }, "examples/table_elements": { @@ -317,6 +341,7 @@ "version": "2.2.0-beta.1", "resolved": "https://registry.npmjs.org/@canva/design/-/design-2.2.0-beta.1.tgz", "integrity": "sha512-OWSLXASC0DvRVj9CCR1RD20JEmGHFaEcyy5WtTic/5O2UXD6p15+XmxbheqCW/wFEPLLOo+GrCM8jSOeMP/oDA==", + "license": "SEE LICENSE IN LICENSE.md FILE", "peerDependencies": { "@canva/error": "^2.0.0" } @@ -327,6 +352,12 @@ "examples/ui_test": { "license": "Please refer to the LICENSE.md file in the root directory" }, + "examples/video_elements": { + "license": "Please refer to the LICENSE.md file in the root directory", + "dependencies": { + "clsx": "2.1.1" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "dev": true, @@ -2144,12 +2175,12 @@ "license": "MIT" }, "node_modules/@canva/app-components": { - "version": "1.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@canva/app-components/-/app-components-1.0.0-beta.28.tgz", - "integrity": "sha512-3Ntmo6Tz1A682sgg8GW7Qmg0DV84CkJ4JQCB7AZCANH980CwIxdnGecESeZm2yTV6JNUmYJRSb34am3vwgngvg==", + "version": "1.0.0-beta.29", + "resolved": "https://registry.npmjs.org/@canva/app-components/-/app-components-1.0.0-beta.29.tgz", + "integrity": "sha512-QsoqJ4wDvs3qYTYHVQ1YNSvW+M2IkFWggZAjQYiZMjdSRxswlZzdfF+WGOZrUnhbYIIq+GZRxLY6QQvK5KsLyA==", "dependencies": { "@canva/asset": "^2.0.0", - "@canva/design": "^2.0.0", + "@canva/design": "^2.1.0", "@canva/error": "^2.0.0", "@canva/platform": "^2.0.0", "@headlessui/react": "^1.7.17", @@ -2168,8 +2199,9 @@ } }, "node_modules/@canva/app-i18n-kit": { - "version": "0.0.1-beta.5", - "license": "SEE LICENSE IN LICENSE.md", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@canva/app-i18n-kit/-/app-i18n-kit-1.0.0.tgz", + "integrity": "sha512-P6ONMEyWgp1mKiX14ZIZI+J6lOVoJ6q05XeGOHnPr2KxsynA2Sq4EB5RSZBgLZCAdiqz1etJT4wDRyPOSXk/JQ==", "peerDependencies": { "intl-messageformat": "10.5.14", "react": "18.3.1", @@ -2178,20 +2210,18 @@ } }, "node_modules/@canva/app-ui-kit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@canva/app-ui-kit/-/app-ui-kit-4.0.0.tgz", - "integrity": "sha512-x6dutj4dMVbglQ6ku0vpnP7Y/xnnEogptuc1Bq/Trul/Sp2NwyND/iFSMRsJC+oCEOYXajOl7RN8DkxSDXUTHA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@canva/app-ui-kit/-/app-ui-kit-4.1.0.tgz", + "integrity": "sha512-rPhX3mZtekPEvSECbl7ORtqYE0vume4HZGuPjBKVVY7Xp0PWbPLhnMp3f8nqUaNU+AFAY6iyRb+5C4ADlS6kJg==", + "license": "SEE LICENSE IN LICENSE.md", "dependencies": { "@floating-ui/react": "^0.26.16", - "@sentry/browser": "7.16.0", - "@sentry/integrations": "7.16.0", - "@sentry/types": "7.16.0", "@seznam/compose-react-refs": "^1.0.4", "classnames": "^2.5.1", "intl-messageformat": "^10.5.4", "intl-pluralrules": "^2.0.1", "make-plural": "^7.3.0", - "mobx": "6.13.1", + "mobx": "6.13.3", "mobx-react-lite": "^4.0.7", "mobx-utils": "^6.0.8", "normalize-scroll-left": "^0.2.1", @@ -2200,8 +2230,6 @@ "react-measure": "^2.5.2", "react-transition-group": "^4.4.1", "resize-observer-polyfill": "^1.5.1", - "rxjs": "6.3.3", - "sa-sdk-javascript": "^1.26.12", "seedrandom": "^3.0.5", "smoothscroll-polyfill": "^0.4.4", "tslib": "^2.5.0" @@ -2215,7 +2243,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@canva/asset/-/asset-2.0.0.tgz", "integrity": "sha512-GmPMRvJSoKNa2mi+d4/qZ9yg6uIoJiNYp/vCJgKMGQ5cR1ysaLcFCC5YA34KNCGALiFsUzRLBTzTjGiGY9s5JA==", - "license": "SEE LICENSE IN LICENSE.md FILE", "peerDependencies": { "@canva/error": "^2.0.0" } @@ -2231,14 +2258,12 @@ "node_modules/@canva/error": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@canva/error/-/error-2.0.0.tgz", - "integrity": "sha512-mJzHNsY6940qgYegrc3ZTxdqqLpRSiWL3Gmd180i+mfcFATW57K2RvJYGRuR1VREMBrtof0tVf/UsWTFhQJPcA==", - "license": "SEE LICENSE IN LICENSE.md FILE" + "integrity": "sha512-mJzHNsY6940qgYegrc3ZTxdqqLpRSiWL3Gmd180i+mfcFATW57K2RvJYGRuR1VREMBrtof0tVf/UsWTFhQJPcA==" }, "node_modules/@canva/platform": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@canva/platform/-/platform-2.0.0.tgz", "integrity": "sha512-jIdF7gL7iTbiWTV5qI2eUMD45oJsvgyNVRXnBy2cSdDYQBQ83TiHhz3QjVvNxd+PAD4YVd/iaDVjYgNmo2sxBg==", - "license": "SEE LICENSE IN LICENSE.md FILE", "peerDependencies": { "@canva/error": "^2.0.0" } @@ -2247,7 +2272,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@canva/user/-/user-2.0.0.tgz", "integrity": "sha512-rELSCK1ZKxxYdEuJhjwtOFFvMWpJ59i/4DwvT/mPVifTQej0bJKWMajiDZkgV+nxF8+cfdDsOg4o7YP40OLmxg==", - "license": "SEE LICENSE IN LICENSE.md FILE", "peerDependencies": { "@canva/error": "^2.0.0" } @@ -2311,6 +2335,29 @@ "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", + "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "3.1.0", "dev": true, @@ -2345,9 +2392,32 @@ } }, "node_modules/@eslint/js": { - "version": "9.9.0", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", "dev": true, - "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "dependencies": { + "levn": "^0.4.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2564,17 +2634,26 @@ "react-dom": "^16 || ^17 || ^18" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", + "node_modules/@humanfs/core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz", + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz", + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@humanfs/core": "^0.19.0", + "@humanwhocodes/retry": "^0.3.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -2589,98 +2668,17 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", + "node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, "engines": { - "node": ">=12" + "node": ">=18.18" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@istanbuljs/load-nyc-config": { @@ -3193,6 +3191,8 @@ }, "node_modules/@ngrok/ngrok": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok/-/ngrok-1.4.1.tgz", + "integrity": "sha512-KZ7/T4UOY3BqJBdweJPeebKW34YzIH+a2y4o7yqTIowoi6dw3sMj140o1Q8FvpPbH5J6lr2TWVCWdgSTYvHNgw==", "dev": true, "license": "(MIT OR Apache-2.0)", "engines": { @@ -3214,6 +3214,40 @@ "@ngrok/ngrok-win32-x64-msvc": "1.4.1" } }, + "node_modules/@ngrok/ngrok-android-arm-eabi": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm-eabi/-/ngrok-android-arm-eabi-1.4.1.tgz", + "integrity": "sha512-KQe59T8PhFg5XvWypcOCIgUakk/A9ipD1UvSgGuLI7pYIiVcx6oyW12RxCJr6cfdO0K5GrbUG6dlEXSmDD4jBg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-android-arm64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-android-arm64/-/ngrok-android-arm64-1.4.1.tgz", + "integrity": "sha512-WPYJenabIArkGmeVhBcIVtgXmLK297pfJCYHP1Tnw220ANEXFdo7EW4dZoP0AA0gxciFHGYnQUMOn1Meo0IQFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@ngrok/ngrok-darwin-arm64": { "version": "1.4.1", "cpu": [ @@ -3241,83 +3275,227 @@ "node": ">= 10" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", + "node_modules/@ngrok/ngrok-darwin-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-darwin-x64/-/ngrok-darwin-x64-1.4.1.tgz", + "integrity": "sha512-UKIkRpsGBywAqvwz8L6R8ITz+xxPoZ58LSFhZoMAWm2alGOdA2js1eHZwwVTSz96/tmmSRE/H+r69TvtuL0lXA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", + "node_modules/@ngrok/ngrok-freebsd-x64": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-freebsd-x64/-/ngrok-freebsd-x64-1.4.1.tgz", + "integrity": "sha512-v1xXqmu3f4W1PQt+NKlqXgLcpULYCSwStKGRSdgXljg1bRdOnW3ZdjbGzrIdKwQ7OcwZP34KbP13G+hqcTxo5Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", + "node_modules/@ngrok/ngrok-linux-arm-gnueabihf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm-gnueabihf/-/ngrok-linux-arm-gnueabihf-1.4.1.tgz", + "integrity": "sha512-yEeiVAGQNUErkSpOI1EZI+X3AkHCGd8yzqfjHamnhEONkwxLcWuTiUfcwFeMVtE9jyLfvQxctldPXXAjvaI/QA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 8" + "node": ">= 10" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", + "node_modules/@ngrok/ngrok-linux-arm64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-gnu/-/ngrok-linux-arm64-gnu-1.4.1.tgz", + "integrity": "sha512-Fb2uju769eO/yOrWdbMvCXNczbXHnqNmN5TCYvqQbPdscFgrsNaJcVr2SmWOfBq+OcLWYbx6mXE1ki5yOZKU9w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14" + "node": ">= 10" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-collection": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", - "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "node_modules/@ngrok/ngrok-linux-arm64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-arm64-musl/-/ngrok-linux-arm64-musl-1.4.1.tgz", + "integrity": "sha512-nMTTZkUnwCzeIVDkoUdNqBKe6ArYXRWGjC4iXinfPOdENkb/tZ/eAjVdg+8bQ5PJgl/n/TbdZKNj//Jz2x8fdw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "node_modules/@ngrok/ngrok-linux-x64-gnu": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-gnu/-/ngrok-linux-x64-gnu-1.4.1.tgz", + "integrity": "sha512-IfDaYd9ZGk7F0szHql5Tr3rlLBlhuKbbNXDVkujGy/njA4/YnckfsZilGEtgnR7aYgHo3NqppfEw+AOmlDytCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-linux-x64-musl": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-linux-x64-musl/-/ngrok-linux-x64-musl-1.4.1.tgz", + "integrity": "sha512-Ze6wb2umg6hfJhxOrFQhiyIZOf9YjSRkefnaQdAaONrIKxiFsu5SIKQbp7MQRnm8wabB9i0OI0Q/TVBsxo/HLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-win32-ia32-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-ia32-msvc/-/ngrok-win32-ia32-msvc-1.4.1.tgz", + "integrity": "sha512-FV3dwGpbh1h2fJ7h+Od8vFRrR9RxqBUAI+ELxQxropDxwYp6rWGKFnfE+JUcT79fEH3OpA0ElULrIDrLgK7bgg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@ngrok/ngrok-win32-x64-msvc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@ngrok/ngrok-win32-x64-msvc/-/ngrok-win32-x64-msvc-1.4.1.tgz", + "integrity": "sha512-Zr1Dyel4M3cA1kjT/N5ftTiCdoPnVv/VbyE6AKKemP9DDFkTlpdvMwSXikm/ypNtCNFEs/+q8CBZPhhaKktl8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", + "license": "MIT" + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -3560,87 +3738,6 @@ "node": ">=14.0.0" } }, - "node_modules/@sentry/browser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.16.0.tgz", - "integrity": "sha512-tJ063zvoF8Raw7mzQEXupOFPSN6v36WIbsDVGeFdToPCwViaBuATaxvWCrudGzsnBkMyItmTLJkzn9SEIXUOiw==", - "dependencies": { - "@sentry/core": "7.16.0", - "@sentry/types": "7.16.0", - "@sentry/utils": "7.16.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.16.0.tgz", - "integrity": "sha512-vq6H1b/IPTvzDD9coQ3wIudvSjkAYuUlXb1dv69dRlq4v3st9dcKBps1Zf0lQ1i4TVlDLoe1iGMmNFglMF1Q5w==", - "dependencies": { - "@sentry/types": "7.16.0", - "@sentry/utils": "7.16.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/integrations": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.16.0.tgz", - "integrity": "sha512-PJRmFUHOKMf1APOlwxGB7Z6LHzJP4xL6OLSoiwnruRuHaGvdyILA53fr/A6wRMSPyTxJDJpNkcN36cA56mLxYA==", - "dependencies": { - "@sentry/types": "7.16.0", - "@sentry/utils": "7.16.0", - "localforage": "^1.8.1", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/integrations/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.16.0.tgz", - "integrity": "sha512-i6D+OK6d0l/k+VQvRp/Pt21WkDEgVBUIZq+sOkEZJczbcfexVdXKeXXoYTD2vYuFq8Yy28fzlsZaKI+NoH94yQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.16.0.tgz", - "integrity": "sha512-3Zh1txg7IRp4kZAdG27YF7K6lD1IZyuAo9KjoPg1Xzqa4DOZyASJuEkbf+rK2a9T4HrtVHHXJUsNbKg8WM3VHg==", - "dependencies": { - "@sentry/types": "7.16.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/@seznam/compose-react-refs": { "version": "1.0.6", "license": "ISC" @@ -3981,9 +4078,10 @@ } }, "node_modules/@testing-library/react": { - "version": "16.0.0", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.0.1.tgz", + "integrity": "sha512-dSmwJVtJXmku+iocRhWOUFbrERC76TX2Mnf0ATODz8brzAZrMBbzLwQixlBSanZxR6LddK3eiwpSFZgDET1URg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5" }, @@ -4141,18 +4239,20 @@ } }, "node_modules/@types/eslint": { - "version": "8.56.12", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.21", @@ -4224,9 +4324,10 @@ } }, "node_modules/@types/jest": { - "version": "29.5.12", + "version": "29.5.13", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.13.tgz", + "integrity": "sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -4282,8 +4383,9 @@ "license": "MIT" }, "node_modules/@types/jsonwebtoken": { - "version": "9.0.6", - "license": "MIT", + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", "dependencies": { "@types/node": "*" } @@ -4356,17 +4458,19 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.4", - "license": "MIT", + "version": "18.3.11", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", + "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.3.0", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", "devOptional": true, - "license": "MIT", "dependencies": { "@types/react": "*" } @@ -4384,11 +4488,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/semver": { - "version": "7.5.8", - "dev": true, - "license": "MIT" - }, "node_modules/@types/send": { "version": "0.17.4", "license": "MIT", @@ -4459,15 +4558,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.2.0", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz", + "integrity": "sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/type-utils": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/type-utils": "8.9.0", + "@typescript-eslint/utils": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -4490,15 +4590,149 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", + "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", + "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", + "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz", + "integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/typescript-estree": "8.9.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", + "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "8.2.0", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.9.0.tgz", + "integrity": "sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/typescript-estree": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", "debug": "^4.3.4" }, "engines": { @@ -4517,14 +4751,180 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", + "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", + "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", + "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", + "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.2.0", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz", + "integrity": "sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0" + "@typescript-eslint/typescript-estree": "8.9.0", + "@typescript-eslint/utils": "8.9.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz", + "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz", + "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==", + "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4533,33 +4933,114 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.2.0", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz", + "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/visitor-keys": "8.9.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz", + "integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.9.0", + "@typescript-eslint/types": "8.9.0", + "@typescript-eslint/typescript-estree": "8.9.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz", + "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.2.0", - "@typescript-eslint/utils": "8.2.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=10" } }, "node_modules/@typescript-eslint/types": { - "version": "8.2.0", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4569,14 +5050,15 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.2.0", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/visitor-keys": "8.2.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", "debug": "^4.3.4", - "globby": "^11.1.0", + "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", @@ -4597,16 +5079,18 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -4619,8 +5103,9 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -4629,14 +5114,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.2.0", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.2.0", - "@typescript-eslint/types": "8.2.0", - "@typescript-eslint/typescript-estree": "8.2.0" + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4650,11 +5136,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.2.0", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.2.0", + "@typescript-eslint/types": "8.5.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -4665,11 +5152,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", "dev": true, @@ -5064,6 +5546,10 @@ "resolved": "examples/app_text_elements", "link": true }, + "node_modules/app_video_elements": { + "resolved": "examples/app_video_elements", + "link": true + }, "node_modules/arg": { "version": "4.1.3", "dev": true, @@ -5120,14 +5606,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "dev": true, @@ -5789,6 +6267,8 @@ }, "node_modules/clsx": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" @@ -5948,30 +6428,25 @@ "license": "MIT" }, "node_modules/cookie": { - "version": "0.6.0", - "license": "MIT", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-parser": { - "version": "1.4.6", - "license": "MIT", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", "dependencies": { - "cookie": "0.4.1", + "cookie": "0.7.2", "cookie-signature": "1.0.6" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/cookie-parser/node_modules/cookie": { - "version": "0.4.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/cookie-signature": { "version": "1.0.6", "license": "MIT" @@ -6182,11 +6657,12 @@ } }, "node_modules/cssnano": { - "version": "7.0.5", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", + "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", "dev": true, - "license": "MIT", "dependencies": { - "cssnano-preset-default": "^7.0.5", + "cssnano-preset-default": "^7.0.6", "lilconfig": "^3.1.2" }, "engines": { @@ -6379,10 +6855,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "license": "MIT", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6450,17 +6927,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-gateway": { - "version": "6.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "license": "MIT", @@ -6577,17 +7043,6 @@ "resolved": "examples/digital_asset_management", "link": true }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dnd-core": { "version": "7.7.0", "license": "MIT", @@ -6733,11 +7188,6 @@ "resolved": "examples/drag_and_drop_video", "link": true }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", "license": "Apache-2.0", @@ -7051,69 +7501,76 @@ } }, "node_modules/eslint": { - "version": "8.57.1", + "version": "9.12.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.6.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.12.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", + "@humanwhocodes/retry": "^0.3.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", - "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", + "eslint-scope": "^8.1.0", + "eslint-visitor-keys": "^4.1.0", + "espree": "^10.2.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, "node_modules/eslint-plugin-formatjs": { - "version": "4.13.3", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-formatjs/-/eslint-plugin-formatjs-5.0.0.tgz", + "integrity": "sha512-ZIQGwa2mF6MU2AWzRi1aigaBzFMRESJfp+KRC7Tm0qm13UTG0GsDkDsxFruf2y/acrbusAvUwkuSwHmyTtVNmw==", "dev": true, - "license": "MIT", "dependencies": { "@formatjs/icu-messageformat-parser": "2.7.8", "@formatjs/ts-transformer": "3.13.14", - "@types/eslint": "7 || 8", + "@types/eslint": "9", "@types/picomatch": "^2.3.0", - "@typescript-eslint/utils": "^6.18.1", + "@typescript-eslint/utils": "8.5.0", "emoji-regex": "^10.2.1", "magic-string": "^0.30.0", "picomatch": "^2.3.1", @@ -7122,110 +7579,7 @@ "unicode-emoji-utils": "^1.2.0" }, "peerDependencies": { - "eslint": "7 || 8" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "eslint": "9" } }, "node_modules/eslint-plugin-formatjs/node_modules/emoji-regex": { @@ -7233,40 +7587,16 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint-plugin-formatjs/node_modules/minimatch": { - "version": "9.0.3", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eslint-plugin-formatjs/node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint-plugin-formatjs/node_modules/tslib": { "version": "2.6.2", "dev": true, "license": "0BSD" }, "node_modules/eslint-plugin-jest": { - "version": "28.8.0", + "version": "28.8.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz", + "integrity": "sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, @@ -7288,9 +7618,10 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.35.0", + "version": "7.37.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz", + "integrity": "sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -7324,132 +7655,64 @@ "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint/node_modules/espree": { - "version": "9.6.1", + "node_modules/eslint-scope": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz", + "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "10.1.0", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz", + "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" + "eslint-visitor-keys": "^4.1.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7459,9 +7722,10 @@ } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz", + "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -7594,16 +7858,16 @@ "link": true }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -7641,6 +7905,14 @@ "basic-auth": "^2.0.1" } }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "license": "MIT", @@ -7764,14 +8036,15 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "flat-cache": "^4.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16.0.0" } }, "node_modules/filelist": { @@ -7866,36 +8139,23 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "keyv": "^4.5.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=16" } }, "node_modules/flatted": { "version": "3.3.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.8", @@ -7928,32 +8188,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/foreground-child": { - "version": "3.3.0", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.0", "dev": true, @@ -8150,9 +8384,10 @@ "license": "BSD-2-Clause" }, "node_modules/globals": { - "version": "15.9.0", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz", + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -8175,25 +8410,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/gopd": { "version": "1.0.1", "license": "MIT", @@ -8531,11 +8747,6 @@ "resolved": "examples/image_replacement", "link": true }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, "node_modules/import-fresh": { "version": "3.3.0", "dev": true, @@ -8909,14 +9120,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "3.0.0", "dev": true, @@ -9190,20 +9393,6 @@ "set-function-name": "^2.0.1" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jake": { "version": "10.9.2", "dev": true, @@ -10135,8 +10324,9 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -10267,8 +10457,9 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -10323,14 +10514,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lilconfig": { "version": "3.1.2", "dev": true, @@ -10390,14 +10573,6 @@ "json5": "lib/cli.js" } }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dependencies": { - "lie": "3.1.1" - } - }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, @@ -10743,18 +10918,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/mobx": { - "version": "6.13.1", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.1.tgz", - "integrity": "sha512-ekLRxgjWJr8hVxj9ZKuClPwM/iHckx3euIJ3Np7zLVNtqJvfbbq7l370W/98C8EabdQ1pB5Jd3BbDWxJPNnaOg==", + "version": "6.13.3", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.13.3.tgz", + "integrity": "sha512-YtAS+ZMbdpbHYUU4ESht3na8KiX11KuMT1yOiKtbKlQ0GZkHDYPKyEw/Tdp7h7aHyLrTWj2TBaSNJ6bCr638iQ==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -10791,8 +10959,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -11228,11 +11397,6 @@ "node": ">=6" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.0", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/page_addition": { "resolved": "examples/page_addition", "link": true @@ -11316,26 +11480,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "dev": true, - "license": "ISC" - }, "node_modules/path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", @@ -12583,61 +12727,6 @@ "resolved": "examples/richtext_replacement", "link": true }, - "node_modules/rimraf": { - "version": "5.0.10", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.5", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-applescript": { "version": "7.0.0", "dev": true, @@ -12671,27 +12760,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/sa-sdk-javascript": { - "version": "1.26.16", - "resolved": "https://registry.npmjs.org/sa-sdk-javascript/-/sa-sdk-javascript-1.26.16.tgz", - "integrity": "sha512-w1Lvug1LKR8OYRx3oXbHkCIPA/U6F7uUODgTso8FkYRHhIfRElKrvVmKP/CGnv5O2cKAX52KvB20jZAywi4dTw==" - }, "node_modules/safe-array-concat": { "version": "1.1.2", "dev": true, @@ -12887,11 +12955,6 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/serialize-javascript": { "version": "6.0.2", "dev": true, @@ -13265,20 +13328,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.matchall": { "version": "4.0.11", "dev": true, @@ -13370,18 +13419,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "dev": true, @@ -13757,19 +13794,20 @@ } }, "node_modules/ts-jest": { - "version": "29.2.4", + "version": "29.2.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", + "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", "dev": true, - "license": "MIT", "dependencies": { - "bs-logger": "0.x", + "bs-logger": "^0.2.6", "ejs": "^3.1.10", - "fast-json-stable-stringify": "2.x", + "fast-json-stable-stringify": "^2.1.0", "jest-util": "^29.0.0", "json5": "^2.2.3", - "lodash.memoize": "4.x", - "make-error": "1.x", - "semver": "^7.5.3", - "yargs-parser": "^21.0.1" + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.6.3", + "yargs-parser": "^21.1.1" }, "bin": { "ts-jest": "cli.js" @@ -14267,6 +14305,10 @@ "node": ">= 0.8" } }, + "node_modules/video_elements": { + "resolved": "examples/video_elements", + "link": true + }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "dev": true, @@ -14323,9 +14365,10 @@ } }, "node_modules/webpack": { - "version": "5.94.0", + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", @@ -14448,9 +14491,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "5.0.4", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.1.0.tgz", + "integrity": "sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -14465,8 +14509,7 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", + "express": "^4.19.2", "graceful-fs": "^4.2.6", "html-entities": "^2.4.0", "http-proxy-middleware": "^2.0.3", @@ -14474,14 +14517,13 @@ "launch-editor": "^2.6.1", "open": "^10.0.3", "p-retry": "^6.2.0", - "rimraf": "^5.0.5", "schema-utils": "^4.2.0", "selfsigned": "^2.4.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^7.1.0", - "ws": "^8.16.0" + "webpack-dev-middleware": "^7.4.2", + "ws": "^8.18.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -14752,23 +14794,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "dev": true, diff --git a/package.json b/package.json index 778dd6af..b2d8315b 100644 --- a/package.json +++ b/package.json @@ -7,16 +7,17 @@ }, "scripts": { "start": "ts-node ./scripts/start/start.ts", - "extract": "formatjs extract 'src/**/*.{ts,tsx}' --out-file dist/messages_en.json", + "extract": "formatjs extract src/**/*.{ts,tsx} --out-file dist/messages_en.json", "build": "webpack --config webpack.config.js --mode production && npm run extract", "lint:types": "tsc", "lint": "eslint .", "lint:fix": "eslint . --fix", - "format": "prettier '{examples,src,utils,scripts}/**/*.{css,ts,tsx,json,js}' --no-config --write", - "format:check": "prettier '{examples,src,utils,scripts}/**/*.{css,ts,tsx,json,js}' --no-config --check --ignore-path", + "format": "prettier '{examples,src,utils,scripts}/**/*.{css,ts,tsx,json,js,mjs}' --write", + "format:check": "prettier '{examples,src,utils,scripts}/**/*.{css,ts,tsx,json,js,mjs}' --check", "format:file": "prettier $1 --no-config --write", "test": "jest --no-cache", - "test:watch": "jest --no-cache --watch" + "test:watch": "jest --no-cache --watch", + "postinstall": "ts-node ./scripts/copy-env.ts" }, "keywords": [], "author": "Canva Pty Ltd.", @@ -26,8 +27,8 @@ "./examples/*" ], "dependencies": { - "@canva/app-i18n-kit": "^0.0.1-beta.5", - "@canva/app-ui-kit": "^4.0.0", + "@canva/app-i18n-kit": "^1.0.0", + "@canva/app-ui-kit": "^4.1.0", "@canva/asset": "^2.0.0", "@canva/design": "^2.1.0", "@canva/error": "^2.0.0", @@ -39,42 +40,42 @@ }, "devDependencies": { "@eslint/eslintrc": "3.1.0", - "@eslint/js": "9.9.0", + "@eslint/js": "9.12.0", "@formatjs/cli": "6.2.12", "@formatjs/ts-transformer": "3.13.14", "@ngrok/ngrok": "1.4.1", "@svgr/webpack": "8.1.0", "@testing-library/dom": "10.4.0", - "@testing-library/react": "16.0.0", + "@testing-library/react": "16.0.1", "@types/debug": "4.1.12", "@types/express": "4.17.21", - "@types/jest": "29.5.12", - "@types/jsonwebtoken": "9.0.6", + "@types/jest": "29.5.13", + "@types/jsonwebtoken": "9.0.7", "@types/node": "20.10.0", "@types/node-fetch": "2.6.11", "@types/node-forge": "1.3.11", "@types/nodemon": "1.19.6", "@types/prompts": "2.4.9", - "@types/react": "18.3.4", - "@types/react-dom": "18.3.0", + "@types/react": "18.3.11", + "@types/react-dom": "18.3.1", "@types/webpack-env": "1.18.5", - "@typescript-eslint/eslint-plugin": "8.2.0", - "@typescript-eslint/parser": "8.2.0", + "@typescript-eslint/eslint-plugin": "8.9.0", + "@typescript-eslint/parser": "8.9.0", "chalk": "4.1.2", "cli-table3": "0.6.5", "css-loader": "7.1.2", "css-modules-typescript-loader": "4.0.1", - "cssnano": "7.0.5", - "debug": "4.3.6", + "cssnano": "7.0.6", + "debug": "4.3.7", "dotenv": "16.4.5", - "eslint": "8.57.1", - "eslint-plugin-formatjs": "4.13.3", - "eslint-plugin-jest": "28.8.0", - "eslint-plugin-react": "7.35.0", + "eslint": "9.12.0", + "eslint-plugin-formatjs": "5.0.0", + "eslint-plugin-jest": "28.8.3", + "eslint-plugin-react": "7.37.1", "exponential-backoff": "3.1.1", - "express": "4.21.0", + "express": "4.21.1", "express-basic-auth": "1.2.1", - "globals": "15.9.0", + "globals": "15.11.0", "jest": "29.7.0", "jest-css-modules-transform": "4.4.2", "jest-environment-jsdom": "29.7.0", @@ -89,14 +90,14 @@ "prompts": "2.4.2", "style-loader": "4.0.0", "terser-webpack-plugin": "5.3.10", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-loader": "9.5.1", "ts-node": "10.9.2", "typescript": "5.5.4", "url-loader": "4.1.1", - "webpack": "5.94.0", + "webpack": "5.95.0", "webpack-cli": "5.1.4", - "webpack-dev-server": "5.0.4", + "webpack-dev-server": "5.1.0", "yargs": "17.7.2" } } diff --git a/scripts/copy-env.ts b/scripts/copy-env.ts new file mode 100644 index 00000000..5f914fb6 --- /dev/null +++ b/scripts/copy-env.ts @@ -0,0 +1,10 @@ +#!/usr/bin/env node +import * as fs from "fs"; +import * as path from "path"; + +const envPath = path.resolve(__dirname, "..", ".env"); +const templatePath = path.resolve(__dirname, "..", ".env.template"); + +if (!fs.existsSync(envPath)) { + fs.copyFileSync(templatePath, envPath); +} diff --git a/tsconfig.json b/tsconfig.json index d90eb8ad..5db73bdb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -37,16 +37,7 @@ "styles": ["./styles"] } }, - "include": [ - "./src/**/*", - "./scripts/**/*", - "./examples/**/*", - "./declarations/declarations.d.ts", - "./utils/**/*", - "./styles/**/*", - "./node_modules/@types/**/*", - "./sdk/**/*" - ], + "include": ["**/*", "./node_modules/@types/**/*"], "ts-node": { "compilerOptions": { "module": "commonjs" diff --git a/webpack.config.js b/webpack.config.js index 03a2c185..36c4d1d1 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -30,15 +30,15 @@ function buildConfig({ if (!backendHost) { console.error( chalk.redBright.bold("BACKEND_HOST is undefined."), - `Refer to "Customizing the backend host" in the README.md for more information.` + `Refer to "Customizing the backend host" in the README.md for more information.`, ); process.exit(-1); } else if (backendHost.includes("localhost") && mode === "production") { console.error( chalk.redBright.bold( - "BACKEND_HOST should not be set to localhost for production builds!" + "BACKEND_HOST should not be set to localhost for production builds!", ), - `Refer to "Customizing the backend host" in the README.md for more information.` + `Refer to "Customizing the backend host" in the README.md for more information.`, ); } @@ -237,7 +237,7 @@ function buildDevConfig(options) { // after a few months. console.warn( - "Enabling Hot Module Replacement (HMR) with an App ID is deprecated, please see the README.md on how to update." + "Enabling Hot Module Replacement (HMR) with an App ID is deprecated, please see the README.md on how to update.", ); const appDomain = `app-${appId.toLowerCase().trim()}.canva-apps.com`; @@ -253,7 +253,7 @@ function buildDevConfig(options) { } else { if (enableHmr && !appOrigin) { console.warn( - "Attempted to enable Hot Module Replacement (HMR) without configuring App Origin... Disabling HMR." + "Attempted to enable Hot Module Replacement (HMR) without configuring App Origin... Disabling HMR.", ); } devServer.webSocketServer = false;