diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5c6b1e127..25c062720 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -8,17 +8,51 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@master + - uses: actions/checkout@v3 - - name: Setup Node.js 16.x - uses: actions/setup-node@master + - uses: supabase/setup-cli@v1 with: - node-version: 16.x + version: latest + + - name: Setup Node.js 18.x + uses: actions/setup-node@v3 + with: + node-version: 18.x + + # from https://github.com/supabase/supabase-action-example/ + - run: supabase start -x studio,imgproxy,storage + working-directory: packages/server + env: + TYPECELL_GITHUB_OAUTH_SECRET: ${{ secrets.TYPECELL_GITHUB_OAUTH_SECRET }} + TYPECELL_GOOGLE_OAUTH_SECRET: ${{ secrets.TYPECELL_GOOGLE_OAUTH_SECRET }} + - run: supabase db lint + working-directory: packages/server + env: + TYPECELL_GITHUB_OAUTH_SECRET: ${{ secrets.TYPECELL_GITHUB_OAUTH_SECRET }} + TYPECELL_GOOGLE_OAUTH_SECRET: ${{ secrets.TYPECELL_GOOGLE_OAUTH_SECRET }} + - run: supabase test db + working-directory: packages/server + env: + TYPECELL_GITHUB_OAUTH_SECRET: ${{ secrets.TYPECELL_GITHUB_OAUTH_SECRET }} + TYPECELL_GOOGLE_OAUTH_SECRET: ${{ secrets.TYPECELL_GOOGLE_OAUTH_SECRET }} + + - name: Verify generated supabase types are checked in + working-directory: packages/server + run: | + supabase gen types typescript --local --schema public > ../shared/src/schema.ts + if ! git diff --ignore-space-at-eol --exit-code --quiet ../shared/src/schema.ts; then + echo "Detected uncommitted changes after build. See status below:" + git diff + exit 1 + fi + env: + TYPECELL_GITHUB_OAUTH_SECRET: ${{ secrets.TYPECELL_GITHUB_OAUTH_SECRET }} + TYPECELL_GOOGLE_OAUTH_SECRET: ${{ secrets.TYPECELL_GOOGLE_OAUTH_SECRET }} # doesn't seem to cause significant speed up, probably because it still needs to install deps - name: cache playwright id: playwright-cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/.cache/ms-playwright key: pw3-${{ runner.os }}-${{ hashFiles('./package-lock.json') }} @@ -33,7 +67,7 @@ jobs: # key: lerna-${{ runner.os }}-${{ hashFiles('./package-lock.json') }} - name: Cache node modules - uses: actions/cache@v2 + uses: actions/cache@v3 env: cache-name: cache-node-modules with: @@ -45,17 +79,17 @@ jobs: ${{ runner.os }}-build- ${{ runner.os }}- - - name: Set correct access for docker containers (server/test/data) - run: chmod -R a+rw test-util/server/data + # - name: Set correct access for docker containers (server/test/data) + # run: chmod -R a+rw test-util/server/data - - name: Build the docker-compose stack - run: docker-compose -f test-util/server/docker-compose.yml up -d + # - name: Build the docker-compose stack + # run: docker-compose -f test-util/server/docker-compose.yml up -d - - name: Check running containers - run: docker ps -a + # - name: Check running containers + # run: docker ps -a - - name: Check docker logs - run: docker logs synapse + # - name: Check docker logs + # run: docker logs synapse - name: NPM CI run: npm ci @@ -63,66 +97,64 @@ jobs: # - name: Bootstrap packages # run: npm run bootstrap - - name: Wait for Matrix - run: npx wait-on http://localhost:8888/_matrix/static/ + # - name: Wait for Matrix + # run: npx wait-on http://localhost:8888/_matrix/static/ - name: Build packages run: npm run build env: CI: true + - name: Build packages (vite react) + run: npm run build:react + env: + CI: true + MODE: development + + - name: Lint + run: npm run lint + env: + CI: true + - name: Install Playwright run: npx playwright install --with-deps # if: steps.playwright-cache.outputs.cache-hit != 'true' # env: # PLAYWRIGHT_BROWSERS_PATH: 0 # https://github.com/microsoft/playwright/blob/main/docs/src/ci.md#caching-browsers - - name: Lint - run: npm run lint + - name: Start HocusPocus server + run: RUNNER_TRACKING_ID="" && npm run start:server & env: CI: true - # Option A: don't build in CI, but test against dev server - # (with Vite, building in CI is now fast enough so we can go for option B) - - # - name: Run dev server - # # Wait on config file needed for vite dev server: https://github.com/jeffbski/wait-on/issues/78 - # run: npm run start:local & npx wait-on http://localhost:5173 -c ./packages/editor/wait-on.conf.json - # env: - # CI: true - - # - name: Run Playwright tests (against dev server) - # run: npm run playwright:dev + - name: Run Tests + run: npm run test + env: + CI: true - # Option B: actually build and run react code and run tests against that - - name: Build and run preview server + # Actually build and run react code and run tests against that + - name: Build and run preview # Wait on config file needed for vite dev server: https://github.com/jeffbski/wait-on/issues/78 run: npm run start:preview & npx wait-on http://localhost:4173 -c ./packages/editor/wait-on.conf.json env: CI: true + MODE: development - - name: Run Playwright tests (against preview server) + - name: Run Playwright tests (against preview) run: npm run playwright:preview - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 if: always() with: name: playwright-report-editor path: packages/editor/playwright-report/ retention-days: 30 - - uses: actions/upload-artifact@v2 - if: always() + # Upload webpack-stats.json to use on relative-ci.yaml workflow + - name: Upload webpack stats artifact + uses: relative-ci/agent-upload-artifact-action@v1 with: - name: playwright-report-engine - path: packages/engine/playwright-report/ - retention-days: 30 - - - name: Run Tests - run: npm run test - env: - CI: true - + webpackStatsFile: ./packages/editor/dist/webpack-stats.json # - name: Upload to coveralls # uses: coverallsapp/github-action@master # with: diff --git a/.github/workflows/prettier.yaml b/.github/workflows/prettier.yaml deleted file mode 100644 index f739dae77..000000000 --- a/.github/workflows/prettier.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# This is a basic workflow to help you get started with Actions - -name: prettier - -# Controls when the action will run. -on: - # Triggers the workflow on push or pull request events but only for the dev branch - push: - branches: [dev] - pull_request: - branches: [dev] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - with: - # Make sure the actual branch is checked out when running on pull requests - ref: ${{ github.head_ref }} - # This is important to fetch the changes to the previous commit - fetch-depth: 0 - - uses: creyD/prettier_action@v3.3 - # with: - # # Running the script in dry mode just shows whether there are files that should be prettified or not - # dry: true - # Only prettify files changed in the last commit, can't be used with file_pattern! - # only_changed: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/production.yaml b/.github/workflows/production.yaml new file mode 100644 index 000000000..ad9e1e631 --- /dev/null +++ b/.github/workflows/production.yaml @@ -0,0 +1,30 @@ +name: Deploy production db + +on: + push: + branches: + - main + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + env: + SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }} + SUPABASE_DB_PASSWORD: ${{ secrets.PRODUCTION_DB_PASSWORD }} + PROJECT_ID: guzxrzrjknsekuefovon + TYPECELL_GITHUB_OAUTH_SECRET: NOT-USED # not used but needs to be set, otherwise supabase cli complains + TYPECELL_GOOGLE_OAUTH_SECRET: NOT-USED # not used but needs to be set, otherwise supabase cli complains + + steps: + - uses: actions/checkout@v3 + + - uses: supabase/setup-cli@v1 + with: + version: latest + + - run: supabase link --project-ref $PROJECT_ID + working-directory: packages/server + - run: supabase db push + working-directory: packages/server diff --git a/.github/workflows/relative-ci.yaml b/.github/workflows/relative-ci.yaml new file mode 100644 index 000000000..d85fa03b7 --- /dev/null +++ b/.github/workflows/relative-ci.yaml @@ -0,0 +1,17 @@ +name: RelativeCI + +on: + workflow_run: + workflows: ["build"] + types: + - completed + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Send bundle stats and build information to RelativeCI + uses: relative-ci/agent-action@v2 + with: + key: ${{ secrets.RELATIVE_CI_KEY }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/staging.yaml b/.github/workflows/staging.yaml new file mode 100644 index 000000000..4a909539f --- /dev/null +++ b/.github/workflows/staging.yaml @@ -0,0 +1,30 @@ +name: Deploy staging db + +on: + push: + branches: + - staging + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + + env: + SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }} + SUPABASE_DB_PASSWORD: ${{ secrets.STAGING_DB_PASSWORD }} + PROJECT_ID: glsqqdamehahvdqssxow + TYPECELL_GITHUB_OAUTH_SECRET: NOT-USED # not used but needs to be set, otherwise supabase cli complains + TYPECELL_GOOGLE_OAUTH_SECRET: NOT-USED # not used but needs to be set, otherwise supabase cli complains + + steps: + - uses: actions/checkout@v3 + + - uses: supabase/setup-cli@v1 + with: + version: latest + + - run: supabase link --project-ref $PROJECT_ID + working-directory: packages/server + - run: supabase db push + working-directory: packages/server diff --git a/.gitignore b/.gitignore index abfa40a4d..b06aa4b57 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ yarn-error.log* .idea/ .vercel +tsconfig.tsbuildinfo \ No newline at end of file diff --git a/.npmrc b/.npmrc index 45c69bbe0..f0141c589 100644 --- a/.npmrc +++ b/.npmrc @@ -1 +1,2 @@ @matrix-org:registry=https://gitlab.matrix.org/api/v4/packages/npm/ +install-links=true diff --git a/.nvmrc b/.nvmrc index 5edcff036..b1215e876 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v16 \ No newline at end of file +v18.16.0 \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 1064b47a9..c49047037 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,11 @@ "search.exclude": { "packages/editor/public/types": true, "**/coverage": true, - "**/dist": true + "**/dist": true, + "**/coverage/**/*": true, + "**/dist/**/*": true, + "**/node_modules/**/*": true, + "**/supabase": true }, "vitest.exclude": [ "**/node_modules/**", @@ -17,5 +21,6 @@ "**/cypress/**", "**/.{idea,git,cache,output,temp}/**", "**/end-to-end/**" - ] + ], + "typescript.preferences.autoImportFileExcludePatterns": ["**/*/dist"] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 54cc4d8b0..67bb95997 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ blocknote │ ├── editor - The main React application │ ├── engine - The live-code execution engine │ ├── packager - Tool to bundle TypeCell notebook apps (WIP) -│ └── parsers - Helpers to convert to / from TypeCell notebooks +│ └── parsers - Helpers to convert to / from TypeCell ├── patches - patch-package patches └── test-util - Server and data for unit tests ``` diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md new file mode 100644 index 000000000..aaeb72bef --- /dev/null +++ b/DEPLOYMENT.md @@ -0,0 +1,22 @@ +# Deployment & CI + +TypeCell currently consists of + +| | development / CI | staging | prod | +| ----------------------------------- | ---------------- | --------------------------- | ------------------------ | +| React app (packages/editor) | Local | Vercel (branch-specific) | Vercel | +| HocusPocus Server (packages/server) | Local | Render (typecell-staging) | Render (typecell-prod) | +| Supabase DB infra (packages/server) | Docker | Supabase (typecell-staging) | Supabase (typecell-prod) | + +A few principles: + +- All Github Actions run against `local` (i.e.: no external dependencies) +- All components should be easy to self-host, we don't want forced dependencies on any cloud provider (note that both supabase and the server are self-hostable). +- Only www.typecell.org is considered `prod`. All Vercel branch-preview environments are considered `staging`, except the main branch which is `prod`. +- Preview environments all share the same `staging` database. This means feature-branches must be compatible in terms of database schema. +- Preview environments all share the same `HocusPocus backend server` (`packages/server`). This means feature-branches must be compatible to run against the same `packages/server`. +- DB Migrations are deployed to `staging` / `prod` when they are pushed to the `staging` / `main` branch (see github workflows). + +## Self-host + +It should be fairly straightforward to host TypeCell yourself, at this moment we don't have a guide for this yet. diff --git a/README.md b/README.md index c7a1ab548..f3a844be0 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ typecell │ ├── editor - The main React application │ ├── engine - The live-code execution engine │ ├── packager - Tool to bundle TypeCell notebook apps (WIP) -│ └── parsers - Helpers to convert to / from TypeCell notebooks +│ └── parsers - Helpers to convert to / from TypeCell documents ├── patches - patch-package patches └── test-util - Server and data for unit tests ``` diff --git a/lerna.json b/lerna.json deleted file mode 100644 index bd6b354f5..000000000 --- a/lerna.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "useNx": false, - "useWorkspaces": true, - "version": "0.1.0" -} diff --git a/package-lock.json b/package-lock.json index b96eb5bbc..0d0f22e18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "root", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -8,94 +8,58 @@ "hasInstallScript": true, "license": "AGPL-3.0", "workspaces": [ - "packages/*" + "packages/util", + "packages/shared", + "packages/shared-test", + "packages/engine", + "packages/parsers", + "packages/frame", + "packages/editor", + "packages/server" ], "devDependencies": { + "@playwright/experimental-ct-react": "^1.33.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", - "lerna": "^5.0.0", - "patch-package": "^6.4.7", - "playwright": "^1.18.1" + "patch-package": "^7.0.0", + "playwright": "^1.33.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" } }, - "../matrix-crdt/packages/matrix-crdt": { - "version": "0.2.0", - "extraneous": true, - "license": "MPL-2.0", - "dependencies": { - "another-json": "^0.2.0", - "lodash": "^4.17.21", - "simple-peer": "^9.11.0", - "vscode-lib": "^0.1.0" - }, - "devDependencies": { - "@matrix-org/olm": "^3.2.12", - "@peculiar/webcrypto": "^1.1.7", - "@types/autocannon": "4.1.1", - "@types/lodash": "^4.14.178", - "@types/qs": "^6.9.7", - "@types/simple-peer": "^9.11.3", - "autocannon": "7.4.0", - "c8": "^7.12.0", - "cross-fetch": "^3.1.4", - "got": "^11.8.2", - "jest-environment-jsdom": "^28.1.3", - "lib0": "^0.2.42", - "matrix-js-sdk": "^19.4.0", - "qs": "^6.10.2", - "rimraf": "^3.0.2", - "typescript": "^4.4.4", - "vite": "^3.0.0", - "vitest": "^0.20.3", - "y-protocols": "^1.0.5", - "yjs": "^13.5.16" - }, - "peerDependencies": { - "lib0": "*", - "matrix-js-sdk": "*", - "y-protocols": "*", - "yjs": "*" + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@arr/every": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", - "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@atlaskit/analytics-namespaced-context": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-namespaced-context/-/analytics-namespaced-context-6.5.1.tgz", - "integrity": "sha512-TZbjsoLBoZiQepvmvfSH5DK1bpSbGM4Syb1Nvh54CTSS/g2in3WNp2/oXn2CrED1PRRdWOEyKLEjTBAfrXDfqA==", + "version": "6.7.2", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/analytics-next": "^8.0.0", + "@atlaskit/analytics-next": "^9.1.0", "@babel/runtime": "^7.0.0" }, "peerDependencies": { @@ -103,9 +67,8 @@ } }, "node_modules/@atlaskit/analytics-next": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next/-/analytics-next-8.3.2.tgz", - "integrity": "sha512-5IW4O1NFRLdO9y8VwlmVECVQeTcZ+WNZv7g1fci61ygNtrABCaaKDfCdvCYKdwSP1dbvlQw865q6vQIx/DV5+A==", + "version": "9.1.4", + "license": "Apache-2.0", "dependencies": { "@atlaskit/analytics-next-stable-react-context": "1.0.1", "@babel/runtime": "^7.0.0", @@ -118,8 +81,7 @@ }, "node_modules/@atlaskit/analytics-next-stable-react-context": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next-stable-react-context/-/analytics-next-stable-react-context-1.0.1.tgz", - "integrity": "sha512-iO6+hIp09dF4iAZQarVz3vKY1kM5Ij5CExYcK9jgc2q+OH8nv8n+BPFeJTdzGOGopmbUZn5Opj9pYQvge1Gr4Q==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.0.0" }, @@ -128,22 +90,23 @@ } }, "node_modules/@atlaskit/atlassian-navigation": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@atlaskit/atlassian-navigation/-/atlassian-navigation-2.2.8.tgz", - "integrity": "sha512-LedkHlFCmdwXG8V+5VGajoStxSYUaYrsmwEIEpjHiNKFeI8GwPhPiEknwwE04xzyj9XtFhM8neVocxXxtP0nmQ==", + "version": "2.6.18", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/analytics-namespaced-context": "^6.5.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", + "@atlaskit/analytics-namespaced-context": "^6.7.0", + "@atlaskit/button": "^16.8.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/icon": "^21.12.0", "@atlaskit/logo": "*", - "@atlaskit/popup": "^1.4.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.5.0", - "@atlaskit/width-detector": "^4.0.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/popup": "^1.9.0", + "@atlaskit/primitives": "^1.0.6", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@atlaskit/tooltip": "^17.8.0", + "@atlaskit/width-detector": "^4.1.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", + "@emotion/react": "^11.7.1", "chromatism": "^2.6.0", "lodash": "^4.17.21" }, @@ -152,14 +115,13 @@ } }, "node_modules/@atlaskit/avatar": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@atlaskit/avatar/-/avatar-21.1.1.tgz", - "integrity": "sha512-mJeKN1QP0o6g76MydxSkF0VJNgS6UCECzuYWuqsWyy3EEghq6e3ToHWHVTGlFCmaF0cFTzvSUgUKE/1LT6B5rA==", + "version": "21.3.8", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/icon": "^21.11.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "@emotion/serialize": "^1.1.0" @@ -168,75 +130,33 @@ "react": "^16.8.0" } }, - "node_modules/@atlaskit/avatar/node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", - "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@atlaskit/avatar/node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "node_modules/@atlaskit/avatar/node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "node_modules/@atlaskit/avatar/node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - }, - "node_modules/@atlaskit/banner": { - "version": "11.6.2", - "resolved": "https://registry.npmjs.org/@atlaskit/banner/-/banner-11.6.2.tgz", - "integrity": "sha512-ymgNPKOyycNeccwD21GVk0HPVgWooINIbatZTDtTGLoCIp0Wg5tVnDqTAIDdWAnSP5avgAYe1ya2KR3fO5Z1gg==", - "dependencies": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - }, - "peerDependencies": { - "react": "^16.8.0" - } - }, "node_modules/@atlaskit/blanket": { - "version": "12.2.15", - "resolved": "https://registry.npmjs.org/@atlaskit/blanket/-/blanket-12.2.15.tgz", - "integrity": "sha512-iI36fkGuSb0ufgdOjmylvT1sSZlyuEU616EQb8q/SUP428tHqMFfkR6yGQZE4LYh2dFuCBU1rLpsVeyLLBd3nw==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "version": "12.4.4", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/codemod-utils": "^4.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.11.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/breadcrumbs": { - "version": "11.7.3", - "resolved": "https://registry.npmjs.org/@atlaskit/breadcrumbs/-/breadcrumbs-11.7.3.tgz", - "integrity": "sha512-q/PaUKGGaFnReFqc4s5+kBE4goUyat+VSMgs/jQ+lOe7+n9Xpz8o12F5RMK6tnh1Zo3LATAxuFbY9D1aAMrVsg==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.6.0", + "version": "11.10.5", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/button": "^16.8.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.11.0", + "@atlaskit/tooltip": "^17.8.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "@react-loosely-lazy/manifest": "^1.0.0", @@ -248,72 +168,38 @@ } }, "node_modules/@atlaskit/button": { - "version": "16.3.6", - "resolved": "https://registry.npmjs.org/@atlaskit/button/-/button-16.3.6.tgz", - "integrity": "sha512-sigJimyIvWjRzBdW46oPoyyxDmIWaPi7YtxmWwshld0lxQ9U/HevAA4Jxo7tOoHkaQot4V+yLkVHTuTgaH4OJQ==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/spinner": "^15.1.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - }, - "peerDependencies": { - "react": "^16.8.0" - } - }, - "node_modules/@atlaskit/checkbox": { - "version": "12.3.19", - "resolved": "https://registry.npmjs.org/@atlaskit/checkbox/-/checkbox-12.3.19.tgz", - "integrity": "sha512-RJ+aLBkLFeWp/0vcKfdVflsl+pJRwHxvWOJYKDkXHOpuVles6JUlWJE/9GsKYESgEqJ47v+2Dhq5g/plVdt3mQ==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "version": "16.9.1", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/focus-ring": "^1.3.0", + "@atlaskit/interaction-context": "^2.1.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/spinner": "^15.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@atlaskit/visually-hidden": "^1.2.4", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/codemod-utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@atlaskit/codemod-utils/-/codemod-utils-4.1.2.tgz", - "integrity": "sha512-L2he0gAJiELTrrN0MP/9qUQtwG/u8p0XJEiUYITmE/Y9U9B1CfSYes1kDWeKDZlV9sN+QB8yP9BeTdIfTYWUbg==", + "version": "4.2.3", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0" } }, - "node_modules/@atlaskit/comment": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@atlaskit/comment/-/comment-10.6.0.tgz", - "integrity": "sha512-08TxoxK+SvoMyzd4UvrWvu6LDIzQokLdcYSejOTRuLtXrwOdASfkT0pdwz406vQj5QeNVOLGi8J2PJLmwx9+1Q==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/lozenge": "^11.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - }, - "peerDependencies": { - "react": "^16.8.0" - } - }, "node_modules/@atlaskit/css-reset": { - "version": "6.3.14", - "resolved": "https://registry.npmjs.org/@atlaskit/css-reset/-/css-reset-6.3.14.tgz", - "integrity": "sha512-KJbBK7bf4jY7Y/x838adkAxkJBFGIAV+vktfkwyci+I+KINoag/MgIML+veD5/sTVfoQuZxoj2mkGjmG7HDtmg==", + "version": "6.5.4", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.13.0", "@babel/runtime": "^7.0.0", "fbjs": "^3.0.0" }, @@ -322,20 +208,21 @@ } }, "node_modules/@atlaskit/dropdown-menu": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/dropdown-menu/-/dropdown-menu-11.4.0.tgz", - "integrity": "sha512-gOeV9H8qhr4R51UT8lvcCdAx+iN4VTB+K5HYmZbG3I9vHt83UMD0SFgmRHVH3pr9V0AxpdmHQn63hmuDjODmZw==", - "dependencies": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/menu": "^1.3.0", - "@atlaskit/popup": "^1.4.0", - "@atlaskit/spinner": "^15.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", + "version": "11.11.6", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/button": "^16.8.0", + "@atlaskit/codemod-utils": "^4.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/menu": "^1.9.0", + "@atlaskit/platform-feature-flags": "^0.2.2", + "@atlaskit/popup": "^1.9.0", + "@atlaskit/primitives": "^1.0.6", + "@atlaskit/spinner": "^15.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@atlaskit/visually-hidden": "^1.2.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1" @@ -346,11 +233,10 @@ } }, "node_modules/@atlaskit/ds-explorations": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@atlaskit/ds-explorations/-/ds-explorations-0.1.2.tgz", - "integrity": "sha512-YE74r/k+ow6GgZm/SxpZl86YeuJx6ZlmI8di5LhSt+KJ5rxxIHCoMt6yvzXmOUy3s4etgppuffUCcXonG58GVA==", + "version": "2.2.9", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/tokens": "^0.10.3", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "tiny-invariant": "^1.2.0" @@ -360,9 +246,8 @@ } }, "node_modules/@atlaskit/ds-lib": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@atlaskit/ds-lib/-/ds-lib-2.1.1.tgz", - "integrity": "sha512-QwaDma9UMUTPaApkjlzt07gmzoEZKegjixlDHEY7DOCzWqGbt1efxuoiP3GLP1Z5eFf5tHWPtlUYMlb+PO37GQ==", + "version": "2.2.3", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0", "bind-event-listener": "^2.1.1" @@ -371,21 +256,37 @@ "react": "^16.8.0" } }, + "node_modules/@atlaskit/empty-state": { + "version": "7.6.3", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/button": "^16.9.0", + "@atlaskit/spinner": "^15.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@babel/runtime": "^7.0.0", + "@emotion/react": "^11.7.1" + }, + "peerDependencies": { + "react": "^16.8.0" + } + }, "node_modules/@atlaskit/flag": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/@atlaskit/flag/-/flag-14.7.0.tgz", - "integrity": "sha512-kIzpihZimEWQxF9rbE44DvGNu9hNjFT+Tr5EYxoDrSIyDY9kRHo3xLK9DPqn0NrwrxJ2e5bV9rM8cQGTUnYyHA==", - "dependencies": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/portal": "^4.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", + "version": "15.2.16", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/button": "^16.8.0", + "@atlaskit/ds-explorations": "^2.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/focus-ring": "^1.3.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/motion": "^1.4.0", + "@atlaskit/portal": "^4.3.0", + "@atlaskit/primitives": "^1.0.6", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.13.0", + "@atlaskit/visually-hidden": "^1.2.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -394,29 +295,26 @@ } }, "node_modules/@atlaskit/focus-ring": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@atlaskit/focus-ring/-/focus-ring-1.0.6.tgz", - "integrity": "sha512-aqTrhYnJDWjrwJrq4vakip9vreZmQKMP/2mP9glQoXIQMCsmOK6hn8G865q+7wfq1TjlbSZwBS7kxX+op+ymWw==", + "version": "1.3.5", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/form": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@atlaskit/form/-/form-8.5.8.tgz", - "integrity": "sha512-IdM+dI9U6YAQxV7tswE8/p7QIdTiW6xb1kJn5C6x/Ux1xAG480vsNQyOJPzQEAdOTssIGbvl7fDbnECEbpXWNg==", + "version": "8.11.12", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", + "@emotion/react": "^11.7.1", "final-form": "^4.20.1", "final-form-focus": "^1.1.2", "lodash": "^4.17.21", @@ -427,13 +325,24 @@ "react": "^16.8.0" } }, + "node_modules/@atlaskit/heading": { + "version": "1.3.7", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/tokens": "^1.11.0", + "@babel/runtime": "^7.0.0", + "@emotion/react": "^11.7.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@atlaskit/icon": { - "version": "21.11.1", - "resolved": "https://registry.npmjs.org/@atlaskit/icon/-/icon-21.11.1.tgz", - "integrity": "sha512-KAcEmf7M04AFeHpzOA+JiHZ6bAXz7h6vNlMd543VZM15fyjMMiP/p3DItnmEwK1mej0zBRT98nnhiDKxaHtJug==", + "version": "21.12.7", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -441,16 +350,22 @@ "react": "^16.8.0" } }, + "node_modules/@atlaskit/in-product-testing": { + "version": "0.2.3", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, "node_modules/@atlaskit/inline-dialog": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/inline-dialog/-/inline-dialog-13.4.0.tgz", - "integrity": "sha512-G7U8Yi3Ypx1eXKXHD5atv9bnM3s+Z6uVqFNGWuMizJnLJhspMQRhjqUb1JMs9OlrJ9VyDU2salQWPOSka1vAhQ==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "version": "13.6.5", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/popper": "^5.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.11.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -461,15 +376,14 @@ } }, "node_modules/@atlaskit/inline-message": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/inline-message/-/inline-message-11.4.0.tgz", - "integrity": "sha512-ziGHgQRnvKWh67NqxH4zPoKWuBEYYw1/+wUeYkh3b+XesYmVhnKm6h6pGndtjmgfTofyImiUyuv8kGkbWNE29w==", - "dependencies": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/inline-dialog": "^13.4.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "version": "11.5.4", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/button": "^16.9.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/inline-dialog": "^13.6.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -477,48 +391,44 @@ "react": "^16.8.0" } }, - "node_modules/@atlaskit/logo": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/@atlaskit/logo/-/logo-13.9.0.tgz", - "integrity": "sha512-l/UGg4JrCMxp9f3GC5scvqhWwh8iZIgiIWFXsfP9oWqA0tB9yNGrxag6hM6QXpWPhXiN4sUPwse8pgxOOnLs2Q==", + "node_modules/@atlaskit/interaction-context": { + "version": "2.1.2", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "react-uid": "^2.2.0" + "@babel/runtime": "^7.0.0" }, "peerDependencies": { "react": "^16.8.0" } }, - "node_modules/@atlaskit/lozenge": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/lozenge/-/lozenge-11.2.0.tgz", - "integrity": "sha512-0YCDa6BEnNbT12TXcsmASwUtxgotvk29xwhPkAhwukSk6Zm9lA/t1CFtTWwBoO65r3gw0neFfoE+3Xe6pGgIkQ==", + "node_modules/@atlaskit/logo": { + "version": "13.14.8", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-explorations": "^0.1.0", - "@atlaskit/theme": "^12.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.11.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1", + "react-uid": "^2.2.0" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/menu": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@atlaskit/menu/-/menu-1.3.9.tgz", - "integrity": "sha512-XWuAMUyRqgoUNLkkpyif/d4qOCQzzbusT7KRC96YvpqS5Vbogbi8m93ZyXccSkjat8ByVlY8p1sgHWSzGko1Dw==", - "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "version": "1.9.8", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/ds-explorations": "^2.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/focus-ring": "^1.3.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/primitives": "^1.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1" }, "peerDependencies": { "react": "^16.8.0", @@ -526,22 +436,22 @@ } }, "node_modules/@atlaskit/modal-dialog": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/modal-dialog/-/modal-dialog-12.3.0.tgz", - "integrity": "sha512-HvmPjaNpu5/SYCfYgqyjFKzXdgoT7jMl6JrESgeYNPQdse8Pzj+Q1CbFynCMJ5+jMg80AMNwrhWYKY/dtKy5tA==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/blanket": "^12.2.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/portal": "^4.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "version": "12.6.6", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/blanket": "^12.4.0", + "@atlaskit/codemod-utils": "^4.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/focus-ring": "^1.3.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/motion": "^1.4.0", + "@atlaskit/portal": "^4.3.0", + "@atlaskit/primitives": "^1.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", + "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", "raf-schd": "^4.0.3", "react-focus-lock": "^2.5.2", @@ -553,13 +463,12 @@ } }, "node_modules/@atlaskit/motion": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@atlaskit/motion/-/motion-1.2.2.tgz", - "integrity": "sha512-UIoFuB299bTehwTkoBs65YS8kn9y32v1b5LsbuSqkWV2ZgiLrWaOdq8RgPBlHuICq9oBeVy6aBPLR0gkht1iJA==", + "version": "1.4.3", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", + "@atlaskit/ds-lib": "^2.2.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", + "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1" }, "peerDependencies": { @@ -567,11 +476,11 @@ } }, "node_modules/@atlaskit/page-header": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/page-header/-/page-header-10.3.0.tgz", - "integrity": "sha512-PAsBEaIamSinpG7J0c9CBDcwcRexSe37yv4samznI2Oupyu7JzeGsoh2FHvUTkscv75Imh1RVvCpoA92OjIPsg==", + "version": "10.4.4", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.5.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -581,15 +490,16 @@ } }, "node_modules/@atlaskit/page-layout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/page-layout/-/page-layout-1.3.0.tgz", - "integrity": "sha512-N9VJyHGoK8nBOCXzXGF/kAp9geumcdShXeExk/0pE2b4LcMzapHCTA7POuj0gAPffswOYcx0FDcr2jc5KnjAoQ==", - "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "version": "1.7.12", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/motion": "^1.4.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/primitives": "^1.0.6", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.13.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -600,11 +510,18 @@ "react-dom": "^16.8.0" } }, + "node_modules/@atlaskit/platform-feature-flags": { + "version": "0.2.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.0.0" + } + }, "node_modules/@atlaskit/popper": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-5.2.8.tgz", - "integrity": "sha512-uQzw8EWWXBhL1N3Dak4ZrkE1hVcqi82bL5COLbS5oYHPcIInJiBZhygAstboVB+BfaKlWtyCdujkBprGU+V5Dw==", + "version": "5.5.4", + "license": "Apache-2.0", "dependencies": { + "@atlaskit/in-product-testing": "^0.2.0", "@babel/runtime": "^7.0.0", "@popperjs/core": "^2.9.1", "react-popper": "^2.2.3" @@ -614,17 +531,17 @@ } }, "node_modules/@atlaskit/popup": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@atlaskit/popup/-/popup-1.4.1.tgz", - "integrity": "sha512-+hPmkoOUIdrU9WamWECq+qlGTdfQQlkGB569FnAFO5gDNgEZo6ZCUgMqRH8jgUa3OSp2aohprZeeYDd6B9rxWA==", - "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/portal": "^4.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "version": "1.9.2", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/popper": "^5.5.0", + "@atlaskit/portal": "^4.3.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", + "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", "focus-trap": "^2.4.5" }, @@ -634,11 +551,10 @@ } }, "node_modules/@atlaskit/portal": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/@atlaskit/portal/-/portal-4.2.10.tgz", - "integrity": "sha512-MmGS1NPiNyCinvmic1UKn2GQl8I9jLjfEz8AUVFimP4ytHFQDBE2sQG7eYN7arQDlhXmZAu2xIFt1A1OyD9OnA==", + "version": "4.3.5", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.1.0", + "@atlaskit/theme": "^12.5.0", "@babel/runtime": "^7.0.0" }, "peerDependencies": { @@ -646,60 +562,59 @@ "react-dom": "^16.8.0" } }, - "node_modules/@atlaskit/progress-bar": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@atlaskit/progress-bar/-/progress-bar-0.5.10.tgz", - "integrity": "sha512-dvCf583efRj7830PKW+wfjUYVMKqvKkaNhC3mJnk1RxfIEETwWUmSaOK9FE3h6vgeb7PBSTo/DlfdPyWRkHrkg==", + "node_modules/@atlaskit/primitives": { + "version": "1.2.1", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" + "@emotion/react": "^11.7.1", + "@emotion/serialize": "^1.1.0", + "bind-event-listener": "^2.1.1" }, "peerDependencies": { - "react": "^16.8.0" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@atlaskit/section-message": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/section-message/-/section-message-6.2.0.tgz", - "integrity": "sha512-hJFYr/LXsTDpuXEXGjwr8pP0meMfYPz+ANQ4kssVSC/ydAAbaMnpd0NrjHO7fcMtfVNqlXfdeqf7l2WsE7DZJA==", - "dependencies": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" + "version": "6.4.11", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/button": "^16.8.0", + "@atlaskit/codemod-utils": "^4.2.0", + "@atlaskit/ds-explorations": "^2.2.0", + "@atlaskit/heading": "^1.3.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/primitives": "^1.0.6", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.13.0", + "@babel/runtime": "^7.0.0" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/select": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@atlaskit/select/-/select-15.7.5.tgz", - "integrity": "sha512-UnFVrJvM3FKAbXf8CqNE0y40X1F4l9Ax2Lupbvj2fnj9gOSFLR+zrI4/c/IDiOyE9CusIjqpkXFl4ft86fn9kQ==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/icon": "^21.11.0", - "@atlaskit/spinner": "^15.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", + "version": "16.5.9", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/icon": "^21.12.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/spinner": "^15.5.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", + "@atlaskit/visually-hidden": "^1.2.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "@popperjs/core": "^2.9.1", - "@types/react-select": "^4.0.18", "bind-event-listener": "^2.1.1", "memoize-one": "^6.0.0", "react-fast-compare": "^3.2.0", "react-focus-lock": "^2.5.2", "react-node-resolver": "^1.0.1", "react-popper": "^2.2.3", - "react-select": "^4.3.1", + "react-select": "^5.4.0", "react-uid": "^2.2.0", "shallow-equal": "^1.0.0" }, @@ -709,12 +624,12 @@ } }, "node_modules/@atlaskit/spinner": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/spinner/-/spinner-15.2.0.tgz", - "integrity": "sha512-0Fwi7D3TgdYoE6rwG2obESUZyQWTGoCx32CAmWGlcOad5dz9RqKBy8kRrnenqOHpATULuPfvD40r0/qe2IGTmQ==", + "version": "15.5.3", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/interaction-context": "^2.1.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.11.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -723,28 +638,28 @@ } }, "node_modules/@atlaskit/textarea": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@atlaskit/textarea/-/textarea-4.3.9.tgz", - "integrity": "sha512-5fyeYhFoaeXCYp448LckY63OHA1NhfhVE/u4PmvonLDug0cfVkCNnqBqqReT8CzCJe4Q+z8+OnPXkG/zKHow0A==", + "version": "4.7.6", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" + "@emotion/react": "^11.7.1" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/textfield": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/textfield/-/textfield-5.2.0.tgz", - "integrity": "sha512-Gf3ABEzsWq9Sw3ySd/67vCidhmU1K/pqudwj7zXP1VBeSxn+mw51YHrUD7TE2VqLUEyFvOmBUQtNmeQDl581KA==", + "version": "5.6.4", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/platform-feature-flags": "^0.2.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" }, @@ -753,13 +668,12 @@ } }, "node_modules/@atlaskit/theme": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/theme/-/theme-12.2.0.tgz", - "integrity": "sha512-fgCWBgmkx7wr/eIui3kOkLiOrhZYt8ON2E5HJMWWohu6I3vYsQUNCbWjp1Uoht0NLgb0FvwYfPeEmsZUJsX9Cg==", + "version": "12.5.6", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/tokens": "^0.10.0", + "@atlaskit/codemod-utils": "^4.2.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0" }, "peerDependencies": { @@ -767,31 +681,31 @@ } }, "node_modules/@atlaskit/tokens": { - "version": "0.10.18", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-0.10.18.tgz", - "integrity": "sha512-WoN0NKaYdx7qnRu8CRzFEHwp9tocsED0YHH0ImO+MmjvwS+lNtfcz7sHbuENOehtCBSCcwohNAWDA4MplvX1wg==", + "version": "1.14.2", + "license": "Apache-2.0", "dependencies": { - "@atlaskit/ds-lib": "^2.1.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/platform-feature-flags": "^0.2.0", "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "bind-event-listener": "^2.1.1" }, "peerDependencies": { "react": "^16.8.0" } }, "node_modules/@atlaskit/tooltip": { - "version": "17.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tooltip/-/tooltip-17.6.1.tgz", - "integrity": "sha512-zI660ZyG/go/M7XEYk7vh562gSX0/u0fCMnM5sln0r/gEk5pAhTDQh+X0oxhF78+S5vw9kUju8eHcpBJwfQ1Kw==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/portal": "^4.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", + "version": "17.8.5", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/analytics-next": "^9.1.0", + "@atlaskit/ds-lib": "^2.2.0", + "@atlaskit/motion": "^1.4.0", + "@atlaskit/popper": "^5.5.0", + "@atlaskit/portal": "^4.3.0", + "@atlaskit/theme": "^12.5.0", + "@atlaskit/tokens": "^1.14.0", "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1", "bind-event-listener": "^2.1.1", @@ -803,9 +717,8 @@ } }, "node_modules/@atlaskit/tree": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/@atlaskit/tree/-/tree-8.6.2.tgz", - "integrity": "sha512-geVyjCm108G35d+VCJaD3fm4DVMSw09l6v8u+v7oriCddYE5nQHYZ0b7ihyupxbryhpfTyUmaD8LcJgWt8WESQ==", + "version": "8.8.5", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0", "css-box-model": "^1.2.0", @@ -815,69 +728,9 @@ "react": "^16.8.0" } }, - "node_modules/@atlaskit/ufo": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@atlaskit/ufo/-/ufo-0.1.3.tgz", - "integrity": "sha512-Triy6E3Ce8xoT85HF2PVvREDS2y2yzT1Q3bij2S0g6odEh31FsSOESpYPA3N7GhPyWXuIFOVY4tRjXvlOfJbVA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "uuid": "^3.1.0" - }, - "peerDependencies": { - "react": "^16.8.0" - } - }, - "node_modules/@atlaskit/ufo/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/@atlaskit/user-picker": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@atlaskit/user-picker/-/user-picker-9.3.4.tgz", - "integrity": "sha512-cc5uJ6Vs/m4Ae5Igp9E5v0Wqb2wn/dRvMqnXkbzSJd6AUUYhCr4/FxTK1AH6n1882tm92axs9C9ZaVAguD6uxw==", - "dependencies": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/avatar": "^21.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/logo": "^13.8.0", - "@atlaskit/lozenge": "^11.0.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/select": "^15.6.0", - "@atlaskit/spinner": "^15.1.4", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.5.0", - "@atlaskit/ufo": "^0.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "lodash": "^4.17.21", - "memoize-one": "^6.0.0", - "uuid": "^3.1.0" - }, - "peerDependencies": { - "react": "^16.8.0", - "react-dom": "^16.8.0", - "react-intl-next": "npm:react-intl@^5.18.1" - } - }, - "node_modules/@atlaskit/user-picker/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, "node_modules/@atlaskit/visually-hidden": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@atlaskit/visually-hidden/-/visually-hidden-1.1.0.tgz", - "integrity": "sha512-z/M9ivFDdOx0HHQ9ifi+eEt7uGyqnpNztYGA2J6vklfWJ30Fjtz3yGmZXwiSVrhOI1MXvwx55mxOg7PnR93DLw==", + "version": "1.2.4", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0", "@emotion/react": "^11.7.1" @@ -887,9 +740,8 @@ } }, "node_modules/@atlaskit/width-detector": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@atlaskit/width-detector/-/width-detector-4.0.2.tgz", - "integrity": "sha512-aYA9t7N4x3dnrEjjP5aQbR1oDE+apJtO50IPa4mB7uPj2sgydHjVME7IOEZ2Xbub8dm/lSIaQHz6/a6M3T89Mw==", + "version": "4.1.3", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.0.0", "raf-schd": "^4.0.3" @@ -899,44 +751,44 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.22.10", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", - "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", + "version": "7.22.9", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", + "version": "7.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -946,90 +798,38 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", - "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "eslint-scope": "^5.1.1", + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/@babel/eslint-parser/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, - "node_modules/@babel/eslint-parser/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", + "version": "7.22.10", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.13", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -1037,67 +837,56 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", + "version": "7.22.10", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", - "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1107,13 +896,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", + "version": "7.22.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1123,145 +912,114 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", + "version": "0.4.2", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, + "version": "7.22.5", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", + "version": "7.22.9", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==", + "version": "7.22.5", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" }, "engines": { "node": ">=6.9.0" @@ -1271,194 +1029,129 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", + "version": "7.22.9", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.22.5", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.9" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "license": "MIT", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.22.5", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.22.5", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.22.5", + "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", + "version": "7.22.10", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.10", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" + "node_modules/@babel/parser": { + "version": "7.22.10", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1468,14 +1161,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1484,29 +1176,10 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1518,98 +1191,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -1620,9 +1211,8 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1636,9 +1226,8 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1650,49 +1239,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "version": "7.21.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1704,9 +1257,8 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1719,14 +1271,13 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.21.11", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1736,27 +1287,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1766,9 +1300,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -1778,9 +1311,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1792,12 +1324,11 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1808,9 +1339,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1820,9 +1350,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -1831,12 +1360,11 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1846,12 +1374,25 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1860,11 +1401,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1873,11 +1424,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.22.5", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1888,9 +1439,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1900,9 +1450,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1912,9 +1461,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1924,9 +1472,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1936,9 +1483,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1948,9 +1494,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1960,9 +1505,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1975,9 +1519,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1989,12 +1532,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2003,30 +1545,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", "dev": true, + "license": "MIT", "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2035,13 +1574,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -2050,13 +1591,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2065,20 +1607,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2087,13 +1621,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2102,13 +1635,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2117,29 +1650,36 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -2148,14 +1688,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2164,14 +1703,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz", - "integrity": "sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-flow": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2180,13 +1717,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2195,15 +1732,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2212,13 +1746,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2227,13 +1761,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2242,15 +1776,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2259,16 +1791,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2277,17 +1806,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2296,14 +1820,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2312,29 +1836,196 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2344,13 +2035,43 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2360,12 +2081,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2374,13 +2094,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2389,13 +2126,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", - "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2405,12 +2141,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2420,16 +2155,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2439,12 +2173,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2454,12 +2187,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", - "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2469,12 +2201,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", - "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2484,13 +2215,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2500,13 +2230,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2516,12 +2245,11 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2531,17 +2259,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2550,22 +2277,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2575,13 +2292,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2591,12 +2307,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2606,12 +2321,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2621,12 +2335,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2636,14 +2349,14 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", - "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", + "version": "7.22.10", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-typescript": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2653,12 +2366,26 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2668,13 +2395,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2683,39 +2409,41 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2725,45 +2453,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.10", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.10", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.10", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.10", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.10", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2772,43 +2517,41 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2818,14 +2561,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "version": "7.22.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2834,24 +2578,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.10", + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs2": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.18.9.tgz", - "integrity": "sha512-l057ZarpDX2QnXM89ViR2BgRFgTy2l5UFGDt0SbInhim1N/ljBgPeTJV0kRG1/Bo7CkHfYfrNNwTeQ2CPph9xQ==", + "version": "7.22.10", + "license": "MIT", "dependencies": { "core-js": "^2.6.12", - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" @@ -2859,50 +2606,33 @@ }, "node_modules/@babel/runtime-corejs2/node_modules/core-js": { "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - }, - "engines": { - "node": ">=6.9.0" - } + "hasInstallScript": true, + "license": "MIT" }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", + "version": "7.22.10", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2911,12 +2641,11 @@ } }, "node_modules/@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", + "version": "7.22.10", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2925,547 +2654,214 @@ }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@blocknote/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.1.0.tgz", - "integrity": "sha512-ElqKLvGkaa9j1+3itnVk8Lvzoxit5AlC4gbTdjlfwp5uoXrLFhSb2bOetDj0CVsgmQxPXv9c4vztwHuojssVxQ==", + "version": "0.9.2", + "license": "MPL-2.0", "dependencies": { - "@atlaskit/button": "^16.3.5", - "@atlaskit/dropdown-menu": "^11.1.2", - "@atlaskit/menu": "^1.3.0", - "@atlaskit/theme": "^12.1.4", - "@tippyjs/react": "^4.2.6", - "@tiptap/core": "^2.0.0-beta.182", - "@tiptap/extension-bold": "^2.0.0-beta.28", - "@tiptap/extension-code": "^2.0.0-beta.28", - "@tiptap/extension-collaboration": "^2.0.0-beta.38", - "@tiptap/extension-collaboration-cursor": "^2.0.0-beta.37", - "@tiptap/extension-dropcursor": "^2.0.0-beta.29", - "@tiptap/extension-gapcursor": "^2.0.0-beta.39", - "@tiptap/extension-hard-break": "^2.0.0-beta.33", - "@tiptap/extension-history": "^2.0.0-beta.26", - "@tiptap/extension-horizontal-rule": "^2.0.0-beta.36", - "@tiptap/extension-italic": "^2.0.0-beta.28", - "@tiptap/extension-link": "^2.0.0-beta.43", - "@tiptap/extension-paragraph": "^2.0.0-beta.26", - "@tiptap/extension-strike": "^2.0.0-beta.29", - "@tiptap/extension-text": "^2.0.0-beta.17", - "@tiptap/extension-underline": "^2.0.0-beta.25", - "@tiptap/react": "^2.0.0-beta.114", + "@emotion/cache": "^11.10.5", + "@emotion/serialize": "^1.1.1", + "@emotion/utils": "^1.2.0", + "@tiptap/core": "^2.0.3", + "@tiptap/extension-bold": "^2.0.3", + "@tiptap/extension-code": "^2.0.3", + "@tiptap/extension-collaboration": "^2.0.3", + "@tiptap/extension-collaboration-cursor": "^2.0.3", + "@tiptap/extension-dropcursor": "^2.0.3", + "@tiptap/extension-gapcursor": "^2.0.3", + "@tiptap/extension-hard-break": "^2.0.3", + "@tiptap/extension-history": "^2.0.3", + "@tiptap/extension-horizontal-rule": "^2.0.3", + "@tiptap/extension-italic": "^2.0.3", + "@tiptap/extension-link": "^2.0.3", + "@tiptap/extension-paragraph": "^2.0.3", + "@tiptap/extension-strike": "^2.0.3", + "@tiptap/extension-text": "^2.0.3", + "@tiptap/extension-underline": "^2.0.3", + "@tiptap/pm": "^2.0.3", + "hast-util-from-dom": "^4.2.0", "lodash": "^4.17.21", - "prosemirror-model": "1.18.1", - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-icons": "^4.3.1", - "styled-components": "^5.3.3", - "uuid": "^8.3.2" + "prosemirror-model": "^1.18.3", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.7.2", + "prosemirror-view": "^1.31.4", + "rehype-parse": "^8.0.4", + "rehype-remark": "^9.1.2", + "rehype-stringify": "^9.0.3", + "remark-gfm": "^3.0.1", + "remark-parse": "^10.0.1", + "remark-rehype": "^10.1.0", + "remark-stringify": "^10.0.2", + "unified": "^10.1.2", + "uuid": "^8.3.2", + "y-prosemirror": "1.0.20", + "y-protocols": "^1.0.5", + "yjs": "^13.6.1" } }, - "node_modules/@blocknote/core/node_modules/@tiptap/react": { - "version": "2.0.0-beta.114", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.0.0-beta.114.tgz", - "integrity": "sha512-9JbRE+16WM6RxbBxzY74SrJtLodvjeRBnEbWxuhxVgGKxMunRj6r8oED87ODJgqLmkpofwE0KFHTPGdEXfdcKA==", + "node_modules/@blocknote/react": { + "version": "0.9.2", + "license": "MPL-2.0", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.0.0-beta.61", - "@tiptap/extension-floating-menu": "^2.0.0-beta.56", - "prosemirror-view": "1.26.2" + "@blocknote/core": "^0.9.2", + "@emotion/react": "^11.10.5", + "@mantine/core": "^5.6.1", + "@mantine/hooks": "^5.6.1", + "@mantine/utils": "^6.0.5", + "@tippyjs/react": "^4.2.6", + "@tiptap/core": "^2.0.3", + "@tiptap/react": "^2.0.3", + "lodash": "^4.17.21", + "react": "^18.2.0", + "react-icons": "^4.3.1", + "tippy.js": "^6.3.7", + "use-prefers-color-scheme": "^1.1.3" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@blocknote/core/node_modules/css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/@blocknote/core/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@blocknote/core/node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/@blocknote/core/node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@blocknote/core/node_modules/react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "peerDependencies": { - "react": "17.0.2" - } - }, - "node_modules/@blocknote/core/node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/@blocknote/core/node_modules/styled-components": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", - "integrity": "sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg==", - "hasInstallScript": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/@blocknote/core/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@deck.gl/aggregation-layers": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-8.8.9.tgz", - "integrity": "sha512-quXUDBeyFau77mlYGmLeGpCzd5NjChdt5+SMG7X7VmxrZuUh6zNP381J1+t6WlNShZdUwjhPKvRQDSYyXo2nIA==", - "dependencies": { - "@luma.gl/constants": "^8.5.16", - "@luma.gl/shadertools": "^8.5.16", - "@math.gl/web-mercator": "^3.6.2", - "d3-hexbin": "^0.2.1" - }, - "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@deck.gl/layers": "^8.0.0", - "@luma.gl/core": "^8.0.0" - } - }, - "node_modules/@deck.gl/core": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.8.9.tgz", - "integrity": "sha512-fRbN/EpoFT2935qlSXrGltUsUFr7Qia8yegLfjRkK244bJX6ptuaRee1GZAeqpCVaWQRbXOM11C2NEe3d64oNg==", - "dependencies": { - "@loaders.gl/core": "^3.2.5", - "@loaders.gl/images": "^3.2.5", - "@luma.gl/constants": "^8.5.16", - "@luma.gl/core": "^8.5.16", - "@math.gl/core": "^3.6.2", - "@math.gl/sun": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@probe.gl/stats": "^3.5.0", - "gl-matrix": "^3.0.0", - "math.gl": "^3.6.2", - "mjolnir.js": "^2.7.0" - } - }, - "node_modules/@deck.gl/layers": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-8.8.9.tgz", - "integrity": "sha512-IwpTfYU2yJdybP4hD2p4A/JZ3jqCzkwpjKxrig43Q4OeR9oNmotS1DOyqD70sF4Al8xOPV9/WxPCht4O7/Pbrw==", - "dependencies": { - "@loaders.gl/images": "^3.2.5", - "@loaders.gl/schema": "^3.2.5", - "@luma.gl/constants": "^8.5.16", - "@mapbox/tiny-sdf": "^1.1.0", - "@math.gl/core": "^3.6.2", - "@math.gl/polygon": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "earcut": "^2.0.6" - }, - "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@loaders.gl/core": "^3.0.0", - "@luma.gl/core": "^8.0.0" - } - }, - "node_modules/@deck.gl/react": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-8.8.9.tgz", - "integrity": "sha512-muCUYVnpKuvxvPnOajpMUADeYQCSemnWjsZgUZGyItn00CbntWWQK889TnZFUNLsBY04XZV3oLTqV9SXL+PaoQ==", "peerDependencies": { - "@deck.gl/core": "^8.0.0", - "@types/react": ">= 16.3", - "react": ">=16.3", - "react-dom": ">=16.3" + "react": "^18", + "react-dom": "^18" } }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz", - "integrity": "sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==", + "version": "11.11.0", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.17.12", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", - "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "node_modules/@emotion/babel-plugin/node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "dependencies": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "node_modules/@emotion/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - }, - "peerDependencies": { - "react": ">=16.3.0" - } - }, - "node_modules/@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", + "version": "11.11.0", + "license": "MIT", "dependencies": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", - "dependencies": { - "@emotion/memoize": "^0.8.0" - } + "version": "0.9.1", + "license": "MIT" }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz", - "integrity": "sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==", + "version": "11.11.1", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.0", - "@emotion/cache": "^11.10.0", - "@emotion/serialize": "^1.1.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0", "react": ">=16.8.0" }, "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, "@types/react": { "optional": true } } }, - "node_modules/@emotion/react/node_modules/@emotion/cache": { - "version": "11.10.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", - "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", - "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.0.13" - } - }, - "node_modules/@emotion/react/node_modules/@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", - "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/react/node_modules/@emotion/sheet": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz", - "integrity": "sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==" - }, - "node_modules/@emotion/react/node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "node_modules/@emotion/react/node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "node_modules/@emotion/react/node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" - }, - "node_modules/@emotion/react/node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, "node_modules/@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", + "version": "1.1.2", + "license": "MIT", "dependencies": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" } }, - "node_modules/@emotion/serialize/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, "node_modules/@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + "version": "1.2.2", + "license": "MIT" }, "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "version": "0.8.1", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.0.1", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" + "version": "1.2.1", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + "version": "0.3.1", + "license": "MIT" }, - "node_modules/@esbuild-plugins/node-globals-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", - "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.11", + "cpu": [ + "arm64" + ], "dev": true, - "peerDependencies": { - "esbuild": "*" + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@esbuild-plugins/node-modules-polyfill": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", - "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" + "eslint-visitor-keys": "^3.3.0" }, - "peerDependencies": { - "esbuild": "*" - } - }, - "node_modules/@esbuild-plugins/node-modules-polyfill/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.6.tgz", - "integrity": "sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "version": "2.1.2", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", + "espree": "^9.6.0", + "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -3480,10 +2876,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "version": "13.21.0", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3496,9 +2891,8 @@ }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3506,127 +2900,158 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@formatjs/ecma402-abstract": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", - "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", - "dependencies": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" + "node_modules/@eslint/js": { + "version": "8.47.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@formatjs/fast-memoize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz", - "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==", + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "license": "MIT", "dependencies": { - "tslib": "^2.1.0" + "@floating-ui/utils": "^0.1.1" } }, - "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", - "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==", + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-skeleton-parser": "1.3.6", - "tslib": "^2.1.0" + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" } }, - "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz", - "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==", + "node_modules/@floating-ui/react": { + "version": "0.25.1", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "tslib": "^2.1.0" + "@floating-ui/react-dom": "^2.0.1", + "@floating-ui/utils": "^0.1.1", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@formatjs/intl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.2.1.tgz", - "integrity": "sha512-vgvyUOOrzqVaOFYzTf2d3+ToSkH2JpR7x/4U1RyoHQLmvEaTQvXJ7A2qm1Iy3brGNXC/+/7bUlc3lpH+h/LOJA==", + "node_modules/@floating-ui/react-dom": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/fast-memoize": "1.2.1", - "@formatjs/icu-messageformat-parser": "2.1.0", - "@formatjs/intl-displaynames": "5.4.3", - "@formatjs/intl-listformat": "6.5.3", - "intl-messageformat": "9.13.0", - "tslib": "^2.1.0" + "@floating-ui/dom": "^1.3.0" }, "peerDependencies": { - "typescript": "^4.5" + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/@hocuspocus/common": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.47" + } + }, + "node_modules/@hocuspocus/extension-database": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/extension-database/-/extension-database-2.4.0.tgz", + "integrity": "sha512-7xx551LbhZUR1BYnit+tceQWhtW9l+/jvYracyaYfWc6R8PD2IRHkkJ0ADQnl+4lEIUi6geWO0Ec8O/0yDHKuA==", + "dependencies": { + "@hocuspocus/server": "^2.4.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "yjs": "^13.6.4" } }, - "node_modules/@formatjs/intl-displaynames": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-5.4.3.tgz", - "integrity": "sha512-4r12A3mS5dp5hnSaQCWBuBNfi9Amgx2dzhU4lTFfhSxgb5DOAiAbMpg6+7gpWZgl4ahsj3l2r/iHIjdmdXOE2Q==", + "node_modules/@hocuspocus/extension-logger": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/extension-logger/-/extension-logger-2.4.0.tgz", + "integrity": "sha512-i6bpHLFJE4oxJ+yW/oIMjiRY2J7/2crWErQNEoAgmog9hJrTAmBtsjCgtH9auVBE0Vh4NJyFyUvD9KPOwK3BEQ==", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" + "@hocuspocus/server": "^2.4.0" } }, - "node_modules/@formatjs/intl-listformat": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.3.tgz", - "integrity": "sha512-ozpz515F/+3CU+HnLi5DYPsLa6JoCfBggBSSg/8nOB5LYSFW9+ZgNQJxJ8tdhKYeODT+4qVHX27EeJLoxLGLNg==", + "node_modules/@hocuspocus/provider": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/provider/-/provider-2.4.0.tgz", + "integrity": "sha512-cEbL94LTd8nTRMSZu/oX4zK3owEwyjQ1n6SgthzfkTqa0XCELCTTyDoCYeialTzJiCfAaJk1Lb2oqnQT73AhGQ==", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" + "@hocuspocus/common": "^2.4.0", + "@lifeomic/attempt": "^3.0.2", + "lib0": "^0.2.47", + "ws": "^7.5.9" + }, + "peerDependencies": { + "y-protocols": "^1.0.5", + "yjs": "^13.6.4" } }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", - "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", + "node_modules/@hocuspocus/server": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@hocuspocus/server/-/server-2.4.0.tgz", + "integrity": "sha512-aKBTRh4HnHu1/uzPjGacDRsKtmL7M3m7XlDD/KkY1oY/u3b06eH8yqKD5h1jTy8XP55z0M/YeYcwSX2hfP9wRQ==", "dependencies": { - "tslib": "^2.1.0" + "@hocuspocus/common": "^2.4.0", + "async-lock": "^1.3.1", + "kleur": "^4.1.4", + "lib0": "^0.2.47", + "uuid": "^9.0.0", + "ws": "^8.5.0" + }, + "peerDependencies": { + "y-protocols": "^1.0.5", + "yjs": "^13.6.4" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true + "node_modules/@hocuspocus/server/node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@hocuspocus/server/node_modules/ws": { + "version": "8.13.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "version": "0.11.10", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3637,38 +3062,31 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.3", + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3679,5034 +3097,4194 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "license": "MIT", "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "version": "1.4.15", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.19", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@lerna/add": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.3.0.tgz", - "integrity": "sha512-MxwTO2UBxZwwuquKbBqdYa56YTqg6Lfz1MZsRQxO7F2cb2NN8NEYTcGOli/71Ee/2AoX4R4xIFTh3TnaflQ25A==", - "dev": true, + "node_modules/@lifeomic/attempt": { + "version": "3.0.3", + "license": "MIT" + }, + "node_modules/@mantine/core": { + "version": "5.10.5", + "license": "MIT", "dependencies": { - "@lerna/bootstrap": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "npm-package-arg": "8.1.1", - "p-map": "^4.0.0", - "pacote": "^13.6.1", - "semver": "^7.3.4" + "@floating-ui/react": "^0.19.1", + "@mantine/styles": "5.10.5", + "@mantine/utils": "5.10.5", + "@radix-ui/react-scroll-area": "1.0.2", + "react-textarea-autosize": "8.3.4" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "@mantine/hooks": "5.10.5", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@lerna/bootstrap": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.3.0.tgz", - "integrity": "sha512-iHVjt6YOQKLY0j+ex13a6ZxjIQ1TSSXqbl6z1hVjBFaDyCh7pra/tgj0LohZDVCaouLwRKucceQfTGrb+cfo7A==", - "dev": true, - "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/has-npm-version": "5.3.0", - "@lerna/npm-install": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/rimraf-dir": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/symlink-binary": "5.3.0", - "@lerna/symlink-dependencies": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@npmcli/arborist": "5.3.0", - "dedent": "^0.7.0", - "get-port": "^5.1.1", - "multimatch": "^5.0.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" - } - }, - "node_modules/@lerna/changed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.3.0.tgz", - "integrity": "sha512-i6ZfBDBZCpnPaSWTuNGTrnExkHNMC+/cSUuS9njaqe+tXgqE95Ja3cMxWZth9Q1uasjcEBHPU2jG0VKrU37rpA==", - "dev": true, + "node_modules/@mantine/core/node_modules/@floating-ui/react": { + "version": "0.19.2", + "license": "MIT", "dependencies": { - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/listable": "5.3.0", - "@lerna/output": "5.3.0" + "@floating-ui/react-dom": "^1.3.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@lerna/check-working-tree": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.3.0.tgz", - "integrity": "sha512-qo6jUGWXKLVL1nU8aEECqwrGRjs9o1l1hXdD2juA4Fvzsam1cFVHJwsmw3hAXGhEPD0oalg/XR62H9rZSCLOvQ==", - "dev": true, + "node_modules/@mantine/core/node_modules/@floating-ui/react-dom": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "@lerna/collect-uncommitted": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "@lerna/validation-error": "5.3.0" + "@floating-ui/dom": "^1.2.1" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@lerna/child-process": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.3.0.tgz", - "integrity": "sha512-4uXPNIptrgQQQVHVVAXBD8F7IqSvZL3Og0G0DHiWKH+dsSyMIUtaIGJt7sifVoL7nzex4AqEiPq/AubpmG5g4Q==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "execa": "^5.0.0", - "strong-log-transformer": "^2.1.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node_modules/@mantine/core/node_modules/@mantine/utils": { + "version": "5.10.5", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@lerna/clean": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.3.0.tgz", - "integrity": "sha512-Jn+Dr7A69dch8m1dLe7l/SDVQVQT2j7zdy2gaZVEmJIgEEaXmEbfJ2t2n06vRXtckI9B85M5mubT1U3Y7KuNuA==", - "dev": true, - "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/rimraf-dir": "5.3.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node_modules/@mantine/hooks": { + "version": "5.10.5", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@lerna/cli": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.3.0.tgz", - "integrity": "sha512-P7F3Xs98pXMEGZX+mnFfsd6gU03x8UrwQ3mElvQBICl4Ew9z6rS8NGUd3JOPFzm4/vSTjYTnPyPdWBjj6/f6sw==", - "dev": true, + "node_modules/@mantine/styles": { + "version": "5.10.5", + "license": "MIT", "dependencies": { - "@lerna/global-options": "5.3.0", - "dedent": "^0.7.0", - "npmlog": "^6.0.2", - "yargs": "^16.2.0" + "clsx": "1.1.1", + "csstype": "3.0.9" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "@emotion/react": ">=11.9.0", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@lerna/collect-uncommitted": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.3.0.tgz", - "integrity": "sha512-Ll/mU9Nes0NQoa0pSv2TR2PTCkIomBGuDWH48OF2sKKu69NuLjrD2L0udS5nJYig9HxFewtm4QTiUdYPxfJXkQ==", - "dev": true, - "dependencies": { - "@lerna/child-process": "5.3.0", - "chalk": "^4.1.0", - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node_modules/@mantine/styles/node_modules/csstype": { + "version": "3.0.9", + "license": "MIT" + }, + "node_modules/@mantine/utils": { + "version": "6.0.19", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" } }, - "node_modules/@lerna/collect-updates": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.3.0.tgz", - "integrity": "sha512-fzJo/rmdXKWKYt+9IXjtenIZtSr3blMH8GEqoVKpSZ7TJGpxcFNmMe6foa60BgaTnDmmg1y7Qu6JbQJ3Ra5c5w==", + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", "dev": true, + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^6.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "eslint-scope": "5.1.1" } }, - "node_modules/@lerna/command": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.3.0.tgz", - "integrity": "sha512-UNQQ4EGTumqLhOuDPcRA4LpdS9pcTYKSdh/8MdKPeyIRN70vCTwdeTrxqaaKsn3Jo7ycvyUQT5yfrUFmCClfoA==", + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/project": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@lerna/write-log-file": "5.3.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^5.0.0", - "is-ci": "^2.0.0", - "npmlog": "^6.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=8.0.0" } }, - "node_modules/@lerna/conventional-commits": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.3.0.tgz", - "integrity": "sha512-9uoQ2E1J7pL0fml5PNO7FydnBNeqrNOQa53Ca1Klf5t/x4vIn51ocOZNm/YbRAc/affnrxxp+gR2/SWlN0yKqQ==", + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", "dev": true, - "dependencies": { - "@lerna/validation-error": "5.3.0", - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-core": "^4.2.4", - "conventional-recommended-bump": "^6.1.0", - "fs-extra": "^9.1.0", - "get-stream": "^6.0.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "pify": "^5.0.0", - "semver": "^7.3.4" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=4.0" } }, - "node_modules/@lerna/create": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.3.0.tgz", - "integrity": "sha512-DotTReCc3+Q9rpMA8RKAGemUK7JXT7skbxHvpqpPj7ryNkIv/dNAFC2EHglcpt9Rmyo6YbSP2zk0gfDbdiIcVA==", - "dev": true, - "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "init-package-json": "^3.0.2", - "npm-package-arg": "8.1.1", - "p-reduce": "^2.1.0", - "pacote": "^13.6.1", - "pify": "^5.0.0", - "semver": "^7.3.4", - "slash": "^3.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0", - "whatwg-url": "^8.4.0", - "yargs-parser": "20.2.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" - } - }, - "node_modules/@lerna/create-symlink": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.3.0.tgz", - "integrity": "sha512-xIoC9m4J/u4NV/8ms4P2fiimaYgialqJvNamvMDRmgE1c3BLDSGk2nE4nVI2W5LxjgJdMTiIH9v1QpTUC9Fv+Q==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, + "license": "MIT", "dependencies": { - "cmd-shim": "^5.0.0", - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/@lerna/describe-ref": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.3.0.tgz", - "integrity": "sha512-R+CtJcOuAF3kJ6GNQnGC3STEi+5OtpNVz2n17sAs/xqJnq79tPdzEhT+pMxB2eSEkQYlSr+cCKMpF0m/mtIPQA==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, - "dependencies": { - "@lerna/child-process": "5.3.0", - "npmlog": "^6.0.2" - }, + "license": "MIT", "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/@lerna/diff": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.3.0.tgz", - "integrity": "sha512-i6f99dtO90u1QIJEfVtKE831m4gnMHBwY+4D84GY2SJMno8uI7ZyxMRZQh1nAFtvlNozO2MgzLr1OHtNMZOIgQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/validation-error": "5.3.0", - "npmlog": "^6.0.2" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">= 8" } }, - "node_modules/@lerna/exec": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.3.0.tgz", - "integrity": "sha512-kI/IuF1hbT+pEMZc3v4+w8BLckUIi45ipzOP0bWvXNgSKKuADAU3HLv+ifRXEjob5906C+Zc7K2IVoVS6r1TDg==", + "node_modules/@playwright/experimental-ct-core": { + "version": "1.37.1", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/profiler": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/validation-error": "5.3.0", - "p-map": "^4.0.0" + "@playwright/test": "1.37.1", + "playwright-core": "1.37.1", + "vite": "^4.3.9" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=16" } }, - "node_modules/@lerna/filter-options": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.3.0.tgz", - "integrity": "sha512-ddgy0oDisTKIhCJ4WY5CeEhTsyrbW+zeBvZ7rVaG0oQXjSSYBried4TXRvgy67fampfHoPX+eQq5l1SYTRFPlw==", + "node_modules/@playwright/experimental-ct-react": { + "version": "1.37.1", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@lerna/collect-updates": "5.3.0", - "@lerna/filter-packages": "5.3.0", - "dedent": "^0.7.0", - "npmlog": "^6.0.2" + "@playwright/experimental-ct-core": "1.37.1", + "@vitejs/plugin-react": "^4.0.0" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=16" } }, - "node_modules/@lerna/filter-packages": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.3.0.tgz", - "integrity": "sha512-5/2V50sQB2+JNwuCHP/UPm3y8PN2JWVY9CbNLtF3K5bymNsCkQh2KHEL9wlWZ4yfr/2ufpy4XFPaFUHNoUOGnQ==", + "node_modules/@playwright/test": { + "version": "1.37.1", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@lerna/validation-error": "5.3.0", - "multimatch": "^5.0.0", - "npmlog": "^6.0.2" + "@types/node": "*", + "playwright-core": "1.37.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, - "node_modules/@lerna/get-npm-exec-opts": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.3.0.tgz", - "integrity": "sha512-cYBypDo8C7f4MvVvap2nYgtk8MXAADrYU1VdECSJ3Stbe4p2vBGt8bM9xkS2uPfQFMK3YSy3YPkSZcSjVXyoGw==", + "node_modules/@polka/url": { + "version": "0.5.0", "dev": true, - "dependencies": { - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/@lerna/get-packed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.3.0.tgz", - "integrity": "sha512-kD12w7Ko5TThuOuPF2HBLyuPsHK3oyyWyzleGBqR4DqxMtbMRgimyTQnr5o58XBOwUPCFsv1EZiqeGk+3HTGEA==", - "dev": true, + "node_modules/@radix-ui/number": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "fs-extra": "^9.1.0", - "ssri": "^9.0.1", - "tar": "^6.1.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "@babel/runtime": "^7.13.10" } }, - "node_modules/@lerna/github-client": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.3.0.tgz", - "integrity": "sha512-UqAclsWDMthmbv3Z8QE1K7D/4e93ytg31mc+nEj+UdU+xJQ0L1ypl8zWAmGNs1sFkQntIiTIB4W5zgHet5mmZw==", - "dev": true, + "node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^19.0.3", - "git-url-parse": "^12.0.0", - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "@babel/runtime": "^7.13.10" } }, - "node_modules/@lerna/gitlab-client": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.3.0.tgz", - "integrity": "sha512-otwbiaGDgvn5MGF1ypsCO48inMpdcxuiDlbxrKD6glPUwNHiGV+PU8LLCCDKimwjjQhl88ySLpL1oTm4jnZ1Aw==", - "dev": true, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "node-fetch": "^2.6.1", - "npmlog": "^6.0.2", - "whatwg-url": "^8.4.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" - } - }, - "node_modules/@lerna/global-options": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.3.0.tgz", - "integrity": "sha512-iEoFrDSU+KtfcB+lHW5grjg3VkEqzZNTUnWnE1FCBBwj9tSLOHjgKGtWWjIQtBUJ+qcLBbusap9Stqzr7UPYpQ==", - "dev": true, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/has-npm-version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.3.0.tgz", - "integrity": "sha512-A/bK8e+QP/VMqZkq1wZbyOzMz/AY92tAVsBOQ5Yw2zqshdMVj99st3YHLOqJf/HTEzQo27GGI/ajmcltHS2l6A==", - "dev": true, + "node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "semver": "^7.3.4" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/import": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.3.0.tgz", - "integrity": "sha512-KjVT9oFNSp1JLdrS1LSXjDcLiu2TMSfy6tpmhF9Zxo7oKB21SgWmXVV9rcWDueW2RIxNXDeVUG0NVNj2BRGeEQ==", - "dev": true, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "p-map-series": "^2.1.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/info": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.3.0.tgz", - "integrity": "sha512-pyeZSM/PIpBHCXdHPrbh6sPZlngXUxhTVFb0VaIjQ5Ms585xi15s1UQDO3FvzqdyMyalx0QGzCJbNx5XeoCejg==", - "dev": true, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/output": "5.3.0", - "envinfo": "^7.7.4" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/init": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.3.0.tgz", - "integrity": "sha512-y46lzEtgMdEseTJGQQqYZOjqqd7iN+e14vFh/9q5h62V4Y8nlUJRzovVo8JSeaGwKLB0B3dq3BuUn0PNywMhpA==", - "dev": true, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/project": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "write-json-file": "^4.3.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/link": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.3.0.tgz", - "integrity": "sha512-+QBwnGg3S8Zk8M8G5CA4kmGq92rkEMbmWJXaxie3jQayp+GXgSlLs6R4jwSOZlztY6xR3WawMI9sHJ0Vdu+g7w==", - "dev": true, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/symlink-dependencies": "5.3.0", - "p-map": "^4.0.0", - "slash": "^3.0.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/list": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.3.0.tgz", - "integrity": "sha512-5RJvle3m4l2H0UmKNlwS8h2OIlNGsNTKPC4DYrJYt0+fhgzf5SEV1QKw+fuUqe3F8MziIkSGQB52HsjwPE6AWQ==", - "dev": true, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/listable": "5.3.0", - "@lerna/output": "5.3.0" + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/listable": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.3.0.tgz", - "integrity": "sha512-RdmeV9mDeuBOgVOlF/KNH/qttyiYwHbeqHiMAw9s9AfMo/Fz3iDZaTGZuruMm84TZSkKxI7m5mjTlC0djsyKog==", - "dev": true, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "@lerna/query-graph": "5.3.0", - "chalk": "^4.1.0", - "columnify": "^1.6.0" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/log-packed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.3.0.tgz", - "integrity": "sha512-tDuOot3vSOUSP7fNNej8UM0fah5oy8mKXe026grt4J0OP4L3rhSWxhfrDBQ3Ylh2dAjgHzscUf/vpnNC9HnhOQ==", - "dev": true, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "byte-size": "^7.0.0", - "columnify": "^1.6.0", - "has-unicode": "^2.0.1", - "npmlog": "^6.0.2" + "@babel/runtime": "^7.13.10" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" } }, - "node_modules/@lerna/npm-conf": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.3.0.tgz", - "integrity": "sha512-ejlypb90tvIsKUCb0fcOKt7wcPEjLdVK2zfbNs0M+UlRDLyRVOHUVdelJ15cRDNjQHzhBo2HBUKn5Fmm/2pcmg==", - "dev": true, - "dependencies": { - "config-chain": "^1.1.12", - "pify": "^5.0.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node_modules/@react-dnd/asap": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@react-dnd/invariant": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@react-dnd/shallowequal": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@react-loosely-lazy/manifest": { + "version": "1.1.0", + "license": "Apache-2.0" + }, + "node_modules/@remirror/core-constants": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@remirror/core-helpers": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "@remirror/types": "^1.0.1", + "@types/object.omit": "^3.0.0", + "@types/object.pick": "^1.3.2", + "@types/throttle-debounce": "^2.1.0", + "case-anything": "^2.1.13", + "dash-get": "^1.0.2", + "deepmerge": "^4.3.1", + "fast-deep-equal": "^3.1.3", + "make-error": "^1.3.6", + "object.omit": "^3.0.0", + "object.pick": "^1.3.0", + "throttle-debounce": "^3.0.1" } }, - "node_modules/@lerna/npm-dist-tag": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.3.0.tgz", - "integrity": "sha512-OPahPk9QLXQXFgtrWm22NNxajVYKavCyTh8ijMwXTGXXbMJAw+PVjokfrUuEtg7FQi+kfJSrYAcJAxxfQq2eiA==", - "dev": true, + "node_modules/@remirror/types": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@lerna/otplease": "5.3.0", - "npm-package-arg": "8.1.1", - "npm-registry-fetch": "^13.3.0", - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "type-fest": "^2.19.0" } }, - "node_modules/@lerna/npm-install": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.3.0.tgz", - "integrity": "sha512-scbWo8nW+P9KfitWG3y7Ep97dOs64ECfz9xfqtjagEXKYBPxG3skvwwljkfNnuxrCNs71JVD+imvcewHzih28g==", - "dev": true, - "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/get-npm-exec-opts": "5.3.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "signal-exit": "^3.0.3", - "write-pkg": "^4.0.0" - }, + "node_modules/@remix-run/router": { + "version": "1.8.0", + "license": "MIT", "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=14.0.0" } }, - "node_modules/@lerna/npm-publish": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.3.0.tgz", - "integrity": "sha512-n+ocN1Dxrs6AmrSNqZl57cwhP4/VjQXdEI+QYauNnErNjMQW8Wt+tNaTlVAhZ1DnorwAo86o2uzFF/BgdUqh9A==", + "node_modules/@rollup/plugin-inject": { + "version": "5.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@lerna/otplease": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "fs-extra": "^9.1.0", - "libnpmpublish": "^6.0.4", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "pify": "^5.0.0", - "read-package-json": "^5.0.1" + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@lerna/npm-run-script": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.3.0.tgz", - "integrity": "sha512-2cLR1YdzeMjaMKgDuwHE+iZgVPt+Ttzb3/wFtp7Mw9TlKmNIdbHdrnfl12ABz5knPC+62CCNjB/gznfLndPp2w==", + "node_modules/@rollup/plugin-inject/node_modules/magic-string": { + "version": "0.27.0", "dev": true, + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "@lerna/get-npm-exec-opts": "5.3.0", - "npmlog": "^6.0.2" + "@jridgewell/sourcemap-codec": "^1.4.13" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@lerna/otplease": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.3.0.tgz", - "integrity": "sha512-Xpju2VC5TiycmBP/mdp9hRstkH2MLm8/7o2NotVTCJwASWdKphRMqezhh5BX0E9i6VyrjzmTqSYEh9FNZZ9MwQ==", + "node_modules/@rollup/pluginutils": { + "version": "5.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@lerna/prompt": "5.3.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } } }, - "node_modules/@lerna/output": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.3.0.tgz", - "integrity": "sha512-fISmHDu/9PKInFmT5NXsbh8cR6aE6SUXWrteXJ6PBYK30s0f/pVcfswb9VccX0Yea8HmqMQgCHWUWifkZeXiRA==", + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.3", "dev": true, - "dependencies": { - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/@lerna/pack-directory": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.3.0.tgz", - "integrity": "sha512-dTGMUB6/GjExhmLZ8yeFaRKJuSm6M/IsfxSJdL4gFPLigUIAS4XhzXS3KnL0+Ef1ue1yaTlAE9c/czfkE0pc/w==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", "dev": true, + "license": "MIT" + }, + "node_modules/@stitches/core": { + "version": "1.2.8", + "license": "MIT" + }, + "node_modules/@supabase/auth-ui-react": { + "version": "0.4.2", "dependencies": { - "@lerna/get-packed": "5.3.0", - "@lerna/package": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/temp-write": "5.3.0", - "npm-packlist": "^5.1.1", - "npmlog": "^6.0.2", - "tar": "^6.1.0" + "@stitches/core": "^1.2.8", + "@supabase/auth-ui-shared": "0.1.6", + "prop-types": "^15.7.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "@supabase/supabase-js": "^2.21.0" } }, - "node_modules/@lerna/package": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.3.0.tgz", - "integrity": "sha512-hsB03miiaNdvZ/UGzl0sVqxVat5x33EG9JiYgIoFqzroQPrG+WShmX3ctuO06TY1pxb4iNuHLPIbQomHEzzj8w==", - "dev": true, + "node_modules/@supabase/auth-ui-shared": { + "version": "0.1.6", + "license": "MIT", + "peerDependencies": { + "@supabase/supabase-js": "^2.21.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.1.2", + "license": "MIT", "dependencies": { - "load-json-file": "^6.2.0", - "npm-package-arg": "8.1.1", - "write-pkg": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "cross-fetch": "^3.1.5" } }, - "node_modules/@lerna/package-graph": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.3.0.tgz", - "integrity": "sha512-UEHY7l/yknwFvQgo0RifyY+B5QdzuFutLZYSN1BMmyWttOZD9rkM263qnLNGTZ2BUE4dXDwwwOHuhLvi+xDRsA==", - "dev": true, + "node_modules/@supabase/functions-js/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/validation-error": "5.3.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "semver": "^7.3.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/@lerna/prerelease-id-from-version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.3.0.tgz", - "integrity": "sha512-o1wsLns6hFTsmk4iqTRJNWLnFzlBBwgu17hp8T2iU4U7LUlDT2ZSKV3smGAU6GfrwX3MAp4LZ5syxgjFjrUOnw==", - "dev": true, + "node_modules/@supabase/gotrue-js": { + "version": "2.47.0", + "license": "MIT", "dependencies": { - "semver": "^7.3.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "cross-fetch": "^3.1.5" } }, - "node_modules/@lerna/profiler": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.3.0.tgz", - "integrity": "sha512-LEZYca29EPgZR0q5E+7CJkn25Cw3OxNMQJU/CVn/HGeoWYWOpoDxujrZBl8is2bw06LHXvRbVXEUATLc+ACbqQ==", - "dev": true, + "node_modules/@supabase/gotrue-js/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2", - "upath": "^2.0.1" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/@lerna/project": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.3.0.tgz", - "integrity": "sha512-InhIo9uwT1yod72ai5SKseJSUk8KkqG6COmwp1/45vibbawb7ZLbokpns7n46A0NdGNlmwJolamybYOuyumejw==", - "dev": true, + "node_modules/@supabase/postgrest-js": { + "version": "1.8.0", + "license": "MIT", "dependencies": { - "@lerna/package": "5.3.0", - "@lerna/validation-error": "5.3.0", - "cosmiconfig": "^7.0.0", - "dedent": "^0.7.0", - "dot-prop": "^6.0.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.2", - "load-json-file": "^6.2.0", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "resolve-from": "^5.0.0", - "write-json-file": "^4.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "cross-fetch": "^3.1.5" } }, - "node_modules/@lerna/prompt": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.3.0.tgz", - "integrity": "sha512-4bIusBdjpw665CJtFsVsaB55hLHnmKnrcOaRjna6N/MdJDl8Th6X4EM4rrfXTX/uUNR3XcV91lYqcLuLmrpm5w==", - "dev": true, + "node_modules/@supabase/postgrest-js/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "inquirer": "^8.2.4", - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/@lerna/publish": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.3.0.tgz", - "integrity": "sha512-T8T1BQdI+NnlVARKwIXzILknEuiQlZToBsDpuX06M7+45t/pp9Z+u6pVt3rrqwiUPZ/dpoZzYKI31YdNJtGMcQ==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "5.3.0", - "@lerna/child-process": "5.3.0", - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "@lerna/log-packed": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/npm-dist-tag": "5.3.0", - "@lerna/npm-publish": "5.3.0", - "@lerna/otplease": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/pack-directory": "5.3.0", - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@lerna/version": "5.3.0", - "fs-extra": "^9.1.0", - "libnpmaccess": "^6.0.3", - "npm-package-arg": "8.1.1", - "npm-registry-fetch": "^13.3.0", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "pacote": "^13.6.1", - "semver": "^7.3.4" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" - } - }, - "node_modules/@lerna/pulse-till-done": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.3.0.tgz", - "integrity": "sha512-yNvSuPLT1ZTtD2LMVOmiDhw4+9qkyf6xCpfxiUp4cGEN+qIuazWB5JicKLE49o27DBdaG8Ao4lAlb16x/gNrwQ==", - "dev": true, + "node_modules/@supabase/realtime-js": { + "version": "2.7.3", + "license": "MIT", "dependencies": { - "npmlog": "^6.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "@types/phoenix": "^1.5.4", + "@types/websocket": "^1.0.3", + "websocket": "^1.0.34" } }, - "node_modules/@lerna/query-graph": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.3.0.tgz", - "integrity": "sha512-t99lNj97/Vilp5Js1Be7MoyaZ5U0fbOFh0E7lnTfSLvZhTkPMK6xLvAx2M3NQqhwYCQjTFDuf9ozQ3HQtYZAmA==", - "dev": true, + "node_modules/@supabase/storage-js": { + "version": "2.5.1", + "license": "MIT", "dependencies": { - "@lerna/package-graph": "5.3.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "cross-fetch": "^3.1.5" } }, - "node_modules/@lerna/resolve-symlink": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.3.0.tgz", - "integrity": "sha512-zKI7rV5FzzlMBfi6kjDS0ulzcdDTORvdOJ/+CHU5C2h+v+P64Nk2VhZZNCCBDoO/l4GRhgehZOB70GIamO1TSw==", - "dev": true, + "node_modules/@supabase/storage-js/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2", - "read-cmd-shim": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/@lerna/rimraf-dir": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.3.0.tgz", - "integrity": "sha512-/QJebh0tSY3LjgEyOo+6NH/b7ZNw9IpjqiDtvnLixjtdfkgli1OKOoZTa4KrO0mJoqMRq4yAa98cjpIzyKqCqw==", - "dev": true, + "node_modules/@supabase/supabase-js": { + "version": "2.32.0", + "license": "MIT", "dependencies": { - "@lerna/child-process": "5.3.0", - "npmlog": "^6.0.2", - "path-exists": "^4.0.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "@supabase/functions-js": "^2.1.0", + "@supabase/gotrue-js": "^2.46.1", + "@supabase/postgrest-js": "^1.8.0", + "@supabase/realtime-js": "^2.7.3", + "@supabase/storage-js": "^2.5.1", + "cross-fetch": "^3.1.5" } }, - "node_modules/@lerna/run": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.3.0.tgz", - "integrity": "sha512-KwoKTj1w71OmUHONNYhZME+tr5lk9Q4f+3LUr2WtWZRuOAGO5ZCRrcZc+N4Ib7zno89Ub6Ovz51fcjwltLh72w==", - "dev": true, + "node_modules/@supabase/supabase-js/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", "dependencies": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/npm-run-script": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/profiler": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/timer": "5.3.0", - "@lerna/validation-error": "5.3.0", - "p-map": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node-fetch": "^2.6.12" } }, - "node_modules/@lerna/run-lifecycle": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.3.0.tgz", - "integrity": "sha512-EuBCGwm2PLgkebfyqo3yNkwfSb1EzHeo3lA8t4yld6LXWkgUPBFhc7RwRc6TsQOpjpfFvDSGoI282R01o0jPVQ==", + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", "dev": true, "dependencies": { - "@lerna/npm-conf": "5.3.0", - "@npmcli/run-script": "^4.1.7", - "npmlog": "^6.0.2", - "p-queue": "^6.6.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" } }, - "node_modules/@lerna/run-topologically": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.3.0.tgz", - "integrity": "sha512-WiFF2EiwLjAguKs0lEmcukTL7WhuWFwxNprrGWFxEkBhlGdMFk18n8BaZN8FO26xqzztzuPzSx1re/f/dEEAPg==", + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "dependencies": { - "@lerna/query-graph": "5.3.0", - "p-queue": "^6.6.2" - }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "sourcemap-codec": "^1.4.8" } }, - "node_modules/@lerna/symlink-binary": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.3.0.tgz", - "integrity": "sha512-dIATASuGS6y512AGjacOoTpkFDPsKlhggjzL3KLdSNmxV3288nUqaFBuA7rTnnMNnBQ7jVuE1JKJupZnzPN0cA==", - "dev": true, + "node_modules/@syncedstore/yjs-reactive-bindings": { + "version": "0.5.2", + "license": "MIT", "dependencies": { - "@lerna/create-symlink": "5.3.0", - "@lerna/package": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0" + "@types/eslint": "6.8.0" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "yjs": "^13.5.13" } }, - "node_modules/@lerna/symlink-dependencies": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.3.0.tgz", - "integrity": "sha512-qkq4YT/Bdrb3W22ve+d2Gy3hRTrtT/zBhjKTCukEpYsFJLwSjZ4z5vbv6J15/j6PN1Km9oTRp6vBYmdjAuARQQ==", - "dev": true, + "node_modules/@tippyjs/react": { + "version": "4.2.6", + "license": "MIT", "dependencies": { - "@lerna/create-symlink": "5.3.0", - "@lerna/resolve-symlink": "5.3.0", - "@lerna/symlink-binary": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0" + "tippy.js": "^6.3.1" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/@lerna/temp-write": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.3.0.tgz", - "integrity": "sha512-AhC5Q+tV0yebEc1P2jsB4apQzztW8dgdLLc1G1Pkt46l5vezRGhZmsj+iUyCsVjpdUSO/UcAq1DbI2Xzhf5arg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^8.3.2" + "node_modules/@tiptap/core": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@lerna/timer": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.3.0.tgz", - "integrity": "sha512-IeDjj1gJtbUPKl2ebpiml9u4k2kRqYF1Dbs6JuWpeC7lGxAx3JcUmkNH2RQ1BYTxk5xc9FKlgNMrZQwhq2K1Ow==", - "dev": true, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "node_modules/@tiptap/extension-bold": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@lerna/validation-error": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.3.0.tgz", - "integrity": "sha512-GVvnTxx+CNFjXCiJahAu2c/pP2R3DhGuQp4CJUyKegnzGaWK0h5PhlwRL7/LbDMPLh2zLobPOVr9kTOjwv76Nw==", - "dev": true, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.1.6", + "license": "MIT", "dependencies": { - "npmlog": "^6.0.2" + "tippy.js": "^6.3.7" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@lerna/version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.3.0.tgz", - "integrity": "sha512-QOQSAdpeP66oQQ20nNZ4NhJS5NtZZDGyz36kP/4BeqjGK6QgtrEmto4+vmWj49w3VJUIXnrqAKHiPkhFUmJm5Q==", - "dev": true, - "dependencies": { - "@lerna/check-working-tree": "5.3.0", - "@lerna/child-process": "5.3.0", - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/conventional-commits": "5.3.0", - "@lerna/github-client": "5.3.0", - "@lerna/gitlab-client": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/temp-write": "5.3.0", - "@lerna/validation-error": "5.3.0", - "chalk": "^4.1.0", - "dedent": "^0.7.0", - "load-json-file": "^6.2.0", - "minimatch": "^3.0.4", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "p-reduce": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4", - "slash": "^3.0.0", - "write-json-file": "^4.3.0" + "node_modules/@tiptap/extension-code": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@lerna/write-log-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.3.0.tgz", - "integrity": "sha512-cmrNAI5+9auUJSuTVrUzt2nb/KX6htgjdw7gGPMI1Tm6cdBIbs67R6LedZ8yvYOLGsXB2Se93vxv5fTgEHWfCw==", - "dev": true, - "dependencies": { - "npmlog": "^6.0.2", - "write-file-atomic": "^4.0.1" + "node_modules/@tiptap/extension-collaboration": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": "^14.15.0 || >=16.0.0" + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "y-prosemirror": "1.0.20" } }, - "node_modules/@loaders.gl/core": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.2.8.tgz", - "integrity": "sha512-C8BNToWgk1tqTzPHuOgP9OYH8P6Inb5fmwz1Fa03vddxIXd4ORoYMleQZSu9x72Dos2dZ476Vs7NYbJbs8KrZw==", - "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.2.8", - "@loaders.gl/worker-utils": "3.2.8", - "@probe.gl/log": "^3.5.0", - "probe.gl": "^3.4.0" + "node_modules/@tiptap/extension-collaboration-cursor": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "y-prosemirror": "1.0.20" } }, - "node_modules/@loaders.gl/images": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.2.8.tgz", - "integrity": "sha512-QD5mGiUmEbZFEuuQpCPB/vGgvlxgRc/OcOlVUz2vxpbvLPjvuTdLQKCLHrCb4DePBIbepwvrcvJRYz91azN6mA==", - "dependencies": { - "@loaders.gl/loader-utils": "3.2.8" + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@loaders.gl/loader-utils": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.2.8.tgz", - "integrity": "sha512-Yp1ixw23tnFNexhP6xPorUj2QeISlzJiyC5oDz+IyFmcpDmQ3qtlD6ChGztkWilnWSohnC2SP+XBZGbpOclgoA==", + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.1.6", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/worker-utils": "3.2.8", - "@probe.gl/stats": "^3.5.0" + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@loaders.gl/schema": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-3.2.8.tgz", - "integrity": "sha512-7Brn+cqGNnaodun0LwnyXtyIX8+73Fr8jQr6TVYZPOHoHXdxVefbJ70bSYlw+tj+dQhWdmqLglUHT0Rxr1gHBQ==", - "dependencies": { - "@types/geojson": "^7946.0.7", - "apache-arrow": "^4.0.0" + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@loaders.gl/worker-utils": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.2.8.tgz", - "integrity": "sha512-CY2TvitiNhs6r+wTQ5McDZmAehklWb5Mb7eCt7aWMthRvhgdWpsMch7QOqOcKFCvuy4JkH37NO86LWFMpXeH8w==", - "dependencies": { - "@babel/runtime": "^7.3.1" + "node_modules/@tiptap/extension-hard-break": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@luma.gl/constants": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-8.5.16.tgz", - "integrity": "sha512-b9JrfhlU4tgQWa7vAzQzzw3yS0NdJBrTEZ6LA9XRKSwVV5VunHXApnrnN4v1oA0AGgnknnUf40PRBZolsVK+7Q==" - }, - "node_modules/@luma.gl/core": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-8.5.16.tgz", - "integrity": "sha512-w3goHMFEhQFlpoXXygFD6zaZvu4rYvMLfDXThpBMUYm8Y4k46UREFYhsV1aOe1aJlaolsRT/9J2fgSDXr0yA3w==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/engine": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@luma.gl/shadertools": "8.5.16", - "@luma.gl/webgl": "8.5.16" + "node_modules/@tiptap/extension-history": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@luma.gl/engine": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-8.5.16.tgz", - "integrity": "sha512-F9wMLg+ystsXa3oOzLezaD1K7ot+kL69IKIJqVjxNecPLf8E/BxJlKL+AZW7SCluka6pFMlGomog0GnjjCxH8Q==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@luma.gl/shadertools": "8.5.16", - "@luma.gl/webgl": "8.5.16", - "@math.gl/core": "^3.5.0", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@luma.gl/gltools": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/gltools/-/gltools-8.5.16.tgz", - "integrity": "sha512-CNCLbKtMRep7tTuB5x3RA7tD70U8XXA8xhABDZs7oAQ0Q/K2EjnwskSUlWzgD3ZPluh6JZzvQBEi4DSmeW3NZA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" + "node_modules/@tiptap/extension-italic": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@luma.gl/shadertools": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-8.5.16.tgz", - "integrity": "sha512-L3M3v6bQhIT8McCeqLvHnLJBmBXYDog1QblF4PVszuIB/WH+cHxZ0I26X2a1eEsVCvdeCrxRBxr42743oyfUNA==", + "node_modules/@tiptap/extension-link": { + "version": "2.1.6", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.0.0", - "@math.gl/core": "^3.5.0" + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" } }, - "node_modules/@luma.gl/webgl": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-8.5.16.tgz", - "integrity": "sha512-vyzr4Mu3+6rKnyu4c5gmTcuDG6xKF49qy316v8oMp45VT0xCQBP17Poq0b0j0VqbGOOtXGI/pxOtr68Ii9fDuA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0" + "node_modules/@tiptap/extension-paragraph": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "node_modules/@math.gl/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz", - "integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@math.gl/types": "3.6.3", - "gl-matrix": "^3.4.0" + "node_modules/@tiptap/extension-strike": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@math.gl/polygon": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-3.6.3.tgz", - "integrity": "sha512-FivQ1ZnYcAss1wVifOkHP/ZnlfQy1IL/769uzNtiHxwUbW0kZG3yyOZ9I7fwyzR5Hvqt3ErJKHjSYZr0uVlz5g==", - "dependencies": { - "@math.gl/core": "3.6.3" + "node_modules/@tiptap/extension-text": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@math.gl/sun": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-3.6.3.tgz", - "integrity": "sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw==", - "dependencies": { - "@babel/runtime": "^7.12.0" + "node_modules/@tiptap/extension-underline": { + "version": "2.1.6", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" } }, - "node_modules/@math.gl/types": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz", - "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" - }, - "node_modules/@math.gl/web-mercator": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz", - "integrity": "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==", + "node_modules/@tiptap/pm": { + "version": "2.1.6", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.0", - "gl-matrix": "^3.4.0" + "prosemirror-changeset": "^2.2.0", + "prosemirror-collab": "^1.3.0", + "prosemirror-commands": "^1.3.1", + "prosemirror-dropcursor": "^1.5.0", + "prosemirror-gapcursor": "^1.3.1", + "prosemirror-history": "^1.3.0", + "prosemirror-inputrules": "^1.2.0", + "prosemirror-keymap": "^1.2.0", + "prosemirror-markdown": "^1.10.1", + "prosemirror-menu": "^1.2.1", + "prosemirror-model": "^1.18.1", + "prosemirror-schema-basic": "^1.2.0", + "prosemirror-schema-list": "^1.2.2", + "prosemirror-state": "^1.4.1", + "prosemirror-tables": "^1.3.0", + "prosemirror-trailing-node": "^2.0.2", + "prosemirror-transform": "^1.7.0", + "prosemirror-view": "^1.28.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@matrix-org/olm": { - "version": "3.2.12", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@tiptap/react": { + "version": "2.1.6", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@tiptap/extension-bubble-menu": "^2.1.6", + "@tiptap/extension-floating-menu": "^2.1.6" }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" }, - "engines": { - "node": ">= 8" + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" } }, - "node_modules/@npmcli/arborist": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.3.0.tgz", - "integrity": "sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==", - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.0", - "cacache": "^16.0.6", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 10" } }, - "node_modules/@npmcli/arborist/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "node_modules/@typecell-org/editor": { + "resolved": "packages/editor", + "link": true + }, + "node_modules/@typecell-org/engine": { + "resolved": "packages/engine", + "link": true + }, + "node_modules/@typecell-org/frame": { + "resolved": "packages/frame", + "link": true + }, + "node_modules/@typecell-org/parsers": { + "resolved": "packages/parsers", + "link": true + }, + "node_modules/@typecell-org/server": { + "resolved": "packages/server", + "link": true + }, + "node_modules/@typecell-org/shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/@typecell-org/shared-test": { + "resolved": "packages/shared-test", + "link": true + }, + "node_modules/@typecell-org/util": { + "resolved": "packages/util", + "link": true + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "@types/chai": "*" } }, - "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, + "node_modules/@types/debug": { + "version": "4.1.8", + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/ms": "*" } }, - "node_modules/@npmcli/fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.1.tgz", - "integrity": "sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg==", - "dev": true, + "node_modules/@types/eslint": { + "version": "6.8.0", + "license": "MIT", "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@npmcli/git": { + "node_modules/@types/estree": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/@types/extend": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", - "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", + "license": "MIT" + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/node": "*" } }, - "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, + "node_modules/@types/hast": { + "version": "2.3.5", + "license": "MIT", "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" + "@types/unist": "^2" } }, - "node_modules/@npmcli/map-workspaces": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz", - "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", + "node_modules/@types/highlight.js": { + "version": "9.12.4", "dev": true, + "license": "MIT" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "license": "MIT", "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@npmcli/map-workspaces/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==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } + "license": "MIT" }, - "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "node_modules/@types/json-schema": { + "version": "7.0.12", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/@npmcli/metavuln-calculator": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz", - "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", + "node_modules/@types/linkify-it": { + "version": "3.0.2", "dev": true, - "dependencies": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/@npmcli/move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "node_modules/@types/lodash": { + "version": "4.14.197", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "10.0.3", "dev": true, + "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/highlight.js": "^9.7.0", + "@types/linkify-it": "*", + "@types/mdurl": "*", + "highlight.js": "^9.7.0" } }, - "node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true + "node_modules/@types/mdast": { + "version": "3.0.12", + "license": "MIT", + "dependencies": { + "@types/unist": "^2" + } }, - "node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "node_modules/@types/mdurl": { + "version": "1.0.2", "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" }, - "node_modules/@npmcli/package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz", - "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", + "node_modules/@types/mocha": { + "version": "9.1.1", "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.5.1", + "license": "MIT" + }, + "node_modules/@types/object.omit": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/@types/object.pick": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "license": "MIT" }, - "node_modules/@npmcli/promise-spawn": { + "node_modules/@types/phoenix": { + "version": "1.6.0", + "license": "MIT" + }, + "node_modules/@types/prettier": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-mFMBfMOz8QxhYVbuINtswBp9VL2b4Y0QqYHwqLz3YbgtfAcat2Dl6Y1o4e22S/OVE6Ebl9m7wWiMT2lSbAs1wA==", + "deprecated": "This is a stub types definition. prettier provides its own type definitions, so you do not need this installed.", "dev": true, "dependencies": { - "infer-owner": "^1.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "prettier": "*" } }, - "node_modules/@npmcli/run-script": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.0.tgz", - "integrity": "sha512-e/QgLg7j2wSJp1/7JRl0GC8c7PMX+uYlA/1Tb+IDOLdSM4T7K1VQ9mm9IGU3WRtY5vEIObpqCLb3aCNCug18DA==", - "dev": true, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.20", + "license": "MIT", "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "node_modules/@nrwl/cli": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.5.4.tgz", - "integrity": "sha512-UYr14hxeYV8p/zt6D6z33hljZJQROJAVxSC+mm72fyVvy88Gt0sQNLfMmOARXur0p/73PSLM0jJ2Sr7Ftsuu+A==", + "node_modules/@types/react-dom": { + "version": "18.2.7", "dev": true, + "license": "MIT", "dependencies": { - "nx": "14.5.4" + "@types/react": "*" } }, - "node_modules/@nrwl/tao": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.5.4.tgz", - "integrity": "sha512-a2GCuSE8WghjehuU3GVO63KZEnZXXQiqEg137yN/Na+PxwSu68XeaX53SLyzRskTV120YwBBy1YCTNzAZxxsjg==", - "dev": true, + "node_modules/@types/react-redux": { + "version": "7.1.25", + "license": "MIT", "dependencies": { - "nx": "14.5.4" - }, - "bin": { - "tao": "index.js" + "@types/hoist-non-react-statics": "^3.3.0", + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0", + "redux": "^4.0.0" } }, - "node_modules/@octokit/auth-token": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", - "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", - "dev": true, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.0.3" - }, - "engines": { - "node": ">= 14" + "@types/react": "*" } }, - "node_modules/@octokit/core": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", - "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", "dev": true, "dependencies": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" + "@types/node": "*" } }, - "node_modules/@octokit/endpoint": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", - "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", + "node_modules/@types/scheduler": { + "version": "0.16.3", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.0", "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "node_modules/@octokit/graphql": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", - "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", + "node_modules/@types/speakingurl": { + "version": "13.0.3", "dev": true, - "dependencies": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - }, - "engines": { - "node": ">= 14" - } + "license": "MIT" }, - "node_modules/@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true + "node_modules/@types/throttle-debounce": { + "version": "2.1.0", + "license": "MIT" }, - "node_modules/@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, - "node_modules/@octokit/plugin-paginate-rest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", - "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", + "node_modules/@types/unist": { + "version": "2.0.7", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "8.3.4", "dev": true, + "license": "MIT" + }, + "node_modules/@types/websocket": { + "version": "1.0.5", + "license": "MIT", "dependencies": { - "@octokit/types": "^6.41.0" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "@octokit/core": ">=4" + "@types/node": "*" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", - "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", "dev": true, + "license": "MIT", "dependencies": { - "@octokit/types": "^6.41.0", - "deprecation": "^2.3.1" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@octokit/core": ">=3" - } - }, - "node_modules/@octokit/request": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", - "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", - "dev": true, - "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, - "engines": { - "node": ">= 14" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@octokit/request-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", - "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", "dependencies": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "yallist": "^4.0.0" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/@octokit/rest": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", - "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.4", "dev": true, + "license": "ISC", "dependencies": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^3.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">= 14" + "node": ">=10" } }, - "node_modules/@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "dependencies": { - "@octokit/openapi-types": "^12.11.0" - } + "license": "ISC" }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", "dev": true, - "hasInstallScript": true, + "license": "MIT", "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" + "@typescript-eslint/utils": "5.62.0" }, "engines": { - "node": ">= 10.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@playwright/test": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.1.tgz", - "integrity": "sha512-IJ4X0yOakXtwkhbnNzKkaIgXe6df7u3H3FnuhI9Jqh+CdO0e/lYQlDLYiyI9cnXK8E7UAppAWP+VqAv6VX7HQg==", + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@types/node": "*", - "playwright-core": "1.25.1" - }, - "bin": { - "playwright": "cli.js" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@playwright/test/node_modules/playwright-core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.1.tgz", - "integrity": "sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==", - "dev": true, - "bin": { - "playwright": "cli.js" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "dev": true - }, - "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@probe.gl/env": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.5.2.tgz", - "integrity": "sha512-JlNvJ2p6+ObWX7es6n3TycGPTv5CfVrCS8vblI1eHhrFCcZ6RxIo727ffRVwldpp0YTzdgjx3/4fB/1dnVYElw==", - "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, - "node_modules/@probe.gl/log": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.5.2.tgz", - "integrity": "sha512-5yo8Dg8LrSltuPBdGlLh/WOvt4LdU7DDHu75GMeiS0fKM+J4IACRpGV8SOrktCj1MWZ6JVHcNQkJnoyZ6G7p/w==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.5.2" - } - }, - "node_modules/@probe.gl/stats": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.5.2.tgz", - "integrity": "sha512-YKaYXiHF//fgy1OkX38JD70Lc8qxg2Viw8Q2CTNMwGPDJe12wda7kEmMKPJNw2oYLyFUfTzv00KJMA5h18z02w==", - "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, - "node_modules/@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" - }, - "node_modules/@react-dnd/invariant": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" - }, - "node_modules/@react-dnd/shallowequal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" - }, - "node_modules/@react-loosely-lazy/manifest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-loosely-lazy/manifest/-/manifest-1.0.0.tgz", - "integrity": "sha512-FM5xuGt/moK+jWD11fGfdeqTBv1VH6dkQHbZS3VXPLaRAmIl096t1RD9KLTGAhvwOMzQlD+/pQ12B+pPAbXgdQ==" - }, - "node_modules/@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-inject/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", "dev": true, + "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" }, "engines": { - "node": ">= 8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", - "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", - "dev": true - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "node_modules/@typescript-eslint/typescript-estree/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": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.4", "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8" } }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } + "license": "ISC" }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=8.0.0" } }, - "node_modules/@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", "dev": true, - "dependencies": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "node": ">=4.0" } }, - "node_modules/@svgr/core/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.4", "dev": true, + "license": "ISC", "dependencies": { - "@babel/types": "^7.12.6" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", "dev": true, + "license": "ISC" + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", "dev": true, + "license": "MIT", "dependencies": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" + "peerDependencies": { + "vite": "^4.2.0" } }, - "node_modules/@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "node_modules/@vitest/coverage-v8": { + "version": "0.33.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - }, - "engines": { - "node": ">=10" + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.1.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@syncedstore/yjs-reactive-bindings": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@syncedstore/yjs-reactive-bindings/-/yjs-reactive-bindings-0.4.0.tgz", - "integrity": "sha512-J1dk8F3ek1MSW0+/dDHr/EuUuavMiCtRnmFaLyxMBO5rhk3QDLphitquTmUkW27WMucZxmiJBH2DgTlPPauShg==", - "dependencies": { - "@types/eslint": "6.8.0" + "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "yjs": "^13.5.13" + "vitest": ">=0.32.0 <1" } }, - "node_modules/@tippyjs/react": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", - "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", + "node_modules/@vitest/expect": { + "version": "0.33.0", + "dev": true, + "license": "MIT", "dependencies": { - "tippy.js": "^6.3.1" + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/@tiptap/core": { - "version": "2.0.0-beta.182", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.182.tgz", - "integrity": "sha512-MZGkMGnVnWhBzjvpBNwQ9zBz38ndi3Irbf90uCTSArR0kaCVkW4vmyuPuOXd+0SO8Yv/l5oyDdOCpaG3rnQYfw==", + "node_modules/@vitest/runner": { + "version": "0.33.0", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-commands": "1.3.0", - "prosemirror-keymap": "1.2.0", - "prosemirror-model": "1.18.1", - "prosemirror-schema-list": "1.2.0", - "prosemirror-state": "1.4.1", - "prosemirror-transform": "1.6.0", - "prosemirror-view": "1.26.2" + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.28.tgz", - "integrity": "sha512-DY8GOzw9xjmTFrnvTbgHUNxTnDfKrkDgrhe0SUvdkT2udntWp8umPdhPiD3vczLgHOJw6tX68qMRjbsR1ZPcHQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.0.0-beta.61", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.61.tgz", - "integrity": "sha512-T3Yx+y1sUnXAJjK1CUfsQewSxOpDca9KzKqN2H9c9RZ9UlorR9XmZg6YYW7m9a7adeihj+o3cCO9jRd8dV+nnA==", + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "tippy.js": "^6.3.7" + "yocto-queue": "^1.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@tiptap/extension-code": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.0.0-beta.28.tgz", - "integrity": "sha512-QPJ2Gwb1+3NgcC1ZIhvVcb+FsnWWDu5VZXTKXM4mz892i9V2x48uHg5anPiUV6pcolXsW1F5VNbXIHGTUUO6CQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@tiptap/extension-collaboration": { - "version": "2.0.0-beta.38", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.0.0-beta.38.tgz", - "integrity": "sha512-oDrQC5z+pLXEQUofkwuJPtysHlP81eTmnKLjjTAAO8zWey3w+nusb6YuQM1W0JbqVD7lcK6YlS+Za+pSA46IdA==", + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-state": "1.4.1", - "y-prosemirror": "1.0.20" + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@tiptap/extension-collaboration-cursor": { - "version": "2.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.0.0-beta.37.tgz", - "integrity": "sha512-3M1aFPTwCGKJ7YNxYZGidJbdZcqAYjOoDCuKfIKVCQgAuKLc5TQf2bA+7ftwG0wI72xdTRoadKA/YCwc67KBvg==", + "node_modules/@vitest/spy": { + "version": "0.33.0", + "dev": true, + "license": "MIT", "dependencies": { - "y-prosemirror": "1.0.20" + "tinyspy": "^2.1.1" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.29.tgz", - "integrity": "sha512-I+joyoFB8pfdXUPLMqdNO08nlB5m2lbu0VQ5dpqdi/HzgVThMZPZA1cW0X8vAUvrALs5/JFRiFoR9hrLN5R5ng==", + "node_modules/@vitest/utils": { + "version": "0.33.0", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-dropcursor": "1.5.0" + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.0.0-beta.56", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.56.tgz", - "integrity": "sha512-j/evHE/6UPGkIgXny9IGcAh0IrcnQmg0b2NBYebs2mqx9xYKYoe+0jVgNdLp/0M3MRgQCzyWTyatBDBFOUR2mw==", + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abstract-leveldown": { + "version": "6.2.3", + "license": "MIT", + "optional": true, "dependencies": { - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "buffer": "^5.5.0", + "immediate": "^3.2.3", + "level-concat-iterator": "~2.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">=6" } }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.0.0-beta.39", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.39.tgz", - "integrity": "sha512-oCyz5WEeQXrEIoa1WXaD52yf1EwMFCXaK1cVzFgUj8lkXJ+nJj+O/Zp0Mg+9/MVR0LYu/kifqVorKNXM4AFA/g==", + "node_modules/abstract-leveldown/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, "dependencies": { - "prosemirror-gapcursor": "1.3.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.0.0-beta.33", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.33.tgz", - "integrity": "sha512-41xf0vSV9hcyTFd01ItLq/CjhjgmOFLCrO3UWN/P2E/cIxuDTyXcvjTE/KXeqRCOV3OYd9fVr0wO91hc8Ij1Yg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "node_modules/abstract-leveldown/node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "optional": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@tiptap/extension-history": { - "version": "2.0.0-beta.26", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.0.0-beta.26.tgz", - "integrity": "sha512-ly19uwvdmXG8Fw1KcavXIHi3Qx6JBASOR7394zghOEpW3atpY8nd/8I373rZ8eDUcGOClfaF7bCx2xvIotAAnw==", + "node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-history": "1.3.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.36.tgz", - "integrity": "sha512-o+Zp7dcn3zAQhtlhZiFB69mTHuH3ZRbGEF7Cbf1D3uX1izotni5zIZbPaFFUT4r6OmVe/vDDt/nopfcGc10ktQ==", + "node_modules/acorn-loose": { + "version": "8.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "prosemirror-state": "1.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "acorn": "^8.5.0" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@tiptap/extension-italic": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.28.tgz", - "integrity": "sha512-/pKRiCfewh7nqiXRD3N4hQHfGrGNOiWPFYZfY35bSpvTms7PDb/MF7xT1CWW23hSpY31BBS+R/a66vlR/gqu7Q==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "node_modules/acorn-walk": { + "version": "8.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@tiptap/extension-link": { - "version": "2.0.0-beta.43", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.0.0-beta.43.tgz", - "integrity": "sha512-AYueqfTW713KGVfWSWhVbj4ObeWudgawikm3m0uYcKSdsAz/CfEvOD2/NA0uyQzlxmYLA6Pf8HMxoKGN+O4Cmg==", + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "linkifyjs": "^3.0.5", - "prosemirror-model": "1.18.1", - "prosemirror-state": "1.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "debug": "4" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.0.0-beta.26", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.26.tgz", - "integrity": "sha512-WcYsuUa7LLfk0vi7I1dVjdMRu53B52FMMqd+UL1qPdDKVkU3DBsZVwPj+yyfQyqN8Mc/xyg9VacGaiKFLmWNDg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "node_modules/aggregate-error": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@tiptap/extension-strike": { - "version": "2.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.29.tgz", - "integrity": "sha512-zqFuY7GfNmZ/KClt6kxQ+msGo3syqucP/Xnlihxi+/h/G+oTvEwyOIXCtDOltvxcsWH/TUsdr5vzLp0j+Mdc6Q==", + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, "funding": { "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@tiptap/extension-text": { - "version": "2.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.17.tgz", - "integrity": "sha512-OyKL+pqWJEtjyd9/mrsuY1kZh2b3LWpOQDWKtd4aWR4EA0efmQG+7FPwcIeAVEh7ZoqM+/ABCnPjN6IjzIrSfg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "node_modules/ansi-colors": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/@tiptap/extension-underline": { - "version": "2.0.0-beta.25", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.25.tgz", - "integrity": "sha512-kRDdb/mF6QWzFGV3cQuLh6xyXULXaKPL/TghefoOZhwkdIWV/M3zFar5tsZO54+tbIrzxoVP6t7mO2Y5G/SLDQ==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" }, - "peerDependencies": { - "@tiptap/core": "^2.0.0-beta.1" + "engines": { + "node": ">=4" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "node_modules/anymatch": { + "version": "3.1.3", "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">= 10" + "node": ">= 8" } }, - "node_modules/@typecell-org/common": { - "resolved": "packages/common", - "link": true + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" }, - "node_modules/@typecell-org/editor": { - "resolved": "packages/editor", - "link": true + "node_modules/aria-hidden": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } }, - "node_modules/@typecell-org/engine": { - "resolved": "packages/engine", - "link": true + "node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } }, - "node_modules/@typecell-org/packager": { - "resolved": "packages/packager", - "link": true + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@typecell-org/parsers": { - "resolved": "packages/parsers", - "link": true + "node_modules/array-includes": { + "version": "3.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", "dev": true, + "license": "MIT", "dependencies": { - "@types/chai": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "dev": true, + "license": "MIT", "dependencies": { - "@types/ms": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-hqzmggoxkOubpgTdcOltkfc5N8IftRJqU70d1jbOISjjZVPvjcr+CLi2CI70hx1SUIRkLgpglTy9w28nGe2Hsw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "node_modules/@types/flatbuffers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.0.tgz", - "integrity": "sha512-7btbphLrKvo5yl/5CC2OCxUSMx1wV1wvGT1qDXkSt7yi00/YW7E8k6qzXqJHsp+WU0eoG7r6MTQQXI9lIvd0qA==" - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "*" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" } }, - "node_modules/@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@types/hammerjs": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", - "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==" + "node_modules/arrify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@types/highlight.js": { - "version": "9.12.4", - "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", - "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", - "dev": true + "node_modules/asap": { + "version": "2.0.6", + "license": "MIT" }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "node_modules/assert": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "node_modules/ast-types-flow": { + "version": "0.0.7", + "dev": true, + "license": "ISC" }, - "node_modules/@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/@types/lodash": { - "version": "4.14.184", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", - "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", - "dev": true + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "optional": true }, - "node_modules/@types/lowlight": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@types/lowlight/-/lowlight-0.0.2.tgz", - "integrity": "sha512-37DldsUs2l4rXI2YQgVn+NKVEaaUbBIzJg3eYzAXimGrtre8vxqE65wAGqYs9W6IsoOfgj74se/rBc9yoRXOHQ==", - "dev": true + "node_modules/async-lock": { + "version": "1.4.0", + "license": "MIT" }, - "node_modules/@types/markdown-it": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.3.tgz", - "integrity": "sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw==", + "node_modules/asynciterator.prototype": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/highlight.js": "^9.7.0", - "@types/linkify-it": "*", - "@types/mdurl": "*", - "highlight.js": "^9.7.0" + "has-symbols": "^1.0.3" } }, - "node_modules/@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "dependencies": { - "@types/unist": "*" + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", - "dev": true + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true + "node_modules/axe-core": { + "version": "4.7.2", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "node_modules/@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", - "devOptional": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", - "dev": true - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.0.25", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", - "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", + "node_modules/axobject-query": { + "version": "3.2.1", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" + "dequal": "^2.0.3" } }, - "node_modules/@types/react-dom": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", - "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "@types/react": "*" + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" } }, - "node_modules/@types/react-redux": { - "version": "7.1.24", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", - "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "dev": true, + "license": "MIT", "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@types/react-select": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.18.tgz", - "integrity": "sha512-uCPRMPshd96BwHuT7oCrFduiv5d6km3VwmtW7rVl9g4XetS3VoJ9nZo540LiwtQgaFcW96POwaxQDZDAyYaepg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "dev": true, + "license": "MIT", "dependencies": { - "@emotion/serialize": "^1.0.0", - "@types/react": "*", - "@types/react-dom": "*", - "@types/react-transition-group": "*" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@types/react-select/node_modules/@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "dev": true, + "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@types/react-select/node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "node_modules/@types/react-select/node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "node_modules/@types/react-select/node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "dev": true, + "license": "MIT" }, - "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "@types/react": "*" + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" } }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "node_modules/@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", - "dev": true - }, - "node_modules/@types/speakingurl": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@types/speakingurl/-/speakingurl-13.0.3.tgz", - "integrity": "sha512-nBHZAaNTEw1YG3ROL7HtTp7HjW8HD7DuFYbWoonUKTZHj7eyOt4vPzyMcc3+xgWNv7xi2rziaiBXHIq6wBeyrw==", - "dev": true + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/@types/text-encoding-utf-8": { + "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-AQ6zewa0ucLJvtUi5HsErbOFKAcQfRLt9zFLlUOvcXBy2G36a+ZDpCHSGdzJVUD8aNURtIjh9aSjCStNMRCcRQ==" - }, - "node_modules/@types/ua-parser-js": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", - "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", - "dev": true - }, - "node_modules/@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true + "dev": true, + "license": "MIT" }, - "node_modules/@types/zxcvbn": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/zxcvbn/-/zxcvbn-4.4.1.tgz", - "integrity": "sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w==", - "dev": true + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", - "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", + "node_modules/bin-links": { + "version": "4.0.2", "dev": true, + "license": "ISC", "dependencies": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/type-utils": "5.36.1", - "@typescript-eslint/utils": "5.36.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.36.1.tgz", - "integrity": "sha512-zLbD16KK1P0tjYXHRKWUcEjJIGDMhbrvjTJyWTfKRLB9NXW45S1zWw4+GZfxEdGzIPyaw22DUgUtyGgr3d7jAg==", + "node_modules/binary-extensions": { + "version": "2.2.0", "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.36.1" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", + "node_modules/bind-event-listener": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/bl": { + "version": "5.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", + "node_modules/brace-expansion": { + "version": "1.1.11", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", - "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", + "node_modules/braces": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.36.1", - "@typescript-eslint/utils": "5.36.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" + "fill-range": "^7.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", + "node_modules/browser-stdout": { + "version": "1.3.1", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "license": "ISC" }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", + "node_modules/browserslist": { + "version": "4.21.10", "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", - "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", - "dev": true, + ], + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "bin": { + "browserslist": "cli.js" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/buffer-from": { + "version": "1.1.2", "dev": true, - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", - "dev": true, + "node_modules/bufferutil": { + "version": "4.0.7", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.36.1", - "eslint-visitor-keys": "^3.3.0" + "node-gyp-build": "^4.3.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript/vfs": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.3.5.tgz", - "integrity": "sha512-pI8Saqjupf9MfLw7w2+og+fmb0fZS0J6vsKXXrp4/PDXEFvntgzXmChCXC/KefZZS0YGS6AT8e0hGAJcTsdJlg==", - "dependencies": { - "debug": "^4.1.1" + "node": ">=6.14.2" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz", - "integrity": "sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA==", + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true, - "dependencies": { - "@babel/core": "^7.18.10", - "@babel/plugin-transform-react-jsx": "^7.18.10", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.18.6", - "magic-string": "^0.26.2", - "react-refresh": "^0.14.0" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=6" }, - "peerDependencies": { - "vite": "^3.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/coverage-c8": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.24.4.tgz", - "integrity": "sha512-1mhYQip6IJw1p9hzM+sH8O/RbILMe7FwScWI7COoMGAThdDRytDjmOal38F/EVrIPZY3nZ5hf7S7JFGjbb4bTg==", + "node_modules/c8": { + "version": "8.0.1", "dev": true, + "license": "ISC", "dependencies": { - "c8": "^7.12.0", - "vitest": "0.24.4" + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, "bin": { - "acorn": "bin/acorn" + "c8": "bin/c8.js" }, "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "node_modules/c8/node_modules/cliui": { + "version": "8.0.1", "dev": true, + "license": "ISC", "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node": ">=12" } }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "node_modules/c8/node_modules/yargs": { + "version": "17.7.2", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">=12" } }, - "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "node_modules/c8/node_modules/yargs-parser": { + "version": "21.1.1", "dev": true, - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, + "license": "ISC", "engines": { - "node": ">= 8.0.0" + "node": ">=12" } }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "node_modules/cac": { + "version": "6.7.14", "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/call-bind": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/another-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/camelcase": { + "version": "7.0.1", "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001522", "dev": true, - "engines": { - "node": ">=8" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/case-anything": { + "version": "2.1.13", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.13" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/mesqueeb" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chai": { + "version": "4.3.7", "dev": true, + "license": "MIT", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/apache-arrow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-4.0.1.tgz", - "integrity": "sha512-DyF7GXCbSjsw4P5C8b+qW7OnJKa6w9mJI0mhV0+EfZbVZCmhfiF6ffqcnrI/kzBrRqn9hH/Ft9n5+m4DTbBJpg==", - "dependencies": { - "@types/flatbuffers": "^1.10.0", - "@types/node": "^14.14.37", - "@types/text-encoding-utf-8": "^1.0.1", - "command-line-args": "5.1.1", - "command-line-usage": "6.1.1", - "flatbuffers": "1.12.0", - "json-bignum": "^0.0.3", - "pad-left": "^2.1.0", - "text-encoding-utf-8": "^1.0.2", - "tslib": "^2.2.0" + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "bin": { - "arrow2csv": "bin/arrow2csv.js" + "engines": { + "node": ">=4" } }, - "node_modules/apache-arrow/node_modules/@types/node": { - "version": "14.18.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz", - "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA==" + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, + "node_modules/charenc": { + "version": "0.0.2", + "license": "BSD-3-Clause", "engines": { - "node": ">=6.0" + "node": "*" } }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "node_modules/check-error": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "node_modules/chokidar": { + "version": "3.5.3", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, "engines": { - "node": ">=8" + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", "dev": true, + "license": "ISC", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/chownr": { + "version": "2.0.0", "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=10" } }, - "node_modules/array.prototype.every": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz", - "integrity": "sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA==", + "node_modules/chromatism": { + "version": "2.6.0", + "license": "ISC" + }, + "node_modules/ci-info": { + "version": "3.8.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "is-string": "^1.0.7" - }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "node_modules/classnames": { + "version": "2.3.2", + "license": "MIT" + }, + "node_modules/clean-stack": { + "version": "4.2.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" + "escape-string-regexp": "5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", + "node_modules/clean-stack/node_modules/escape-string-regexp": { + "version": "5.0.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", + "node_modules/cli-cursor": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/cli-spinners": { + "version": "2.9.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", "dependencies": { - "safer-buffer": "~2.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/clone": { + "version": "1.0.4", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.8" } }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "node_modules/clsx": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.1", "dev": true, + "license": "ISC", "engines": { - "node": "*" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "node_modules/combined-stream": { + "version": "1.0.8", "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.8" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, "engines": { - "node": "*" + "node": ">=4.0.0" } }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", + "node_modules/confusing-browser-globals": { + "version": "1.0.11", "dev": true, + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=0.8" } }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" }, - "node_modules/babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "node_modules/core-js": { + "version": "3.32.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.32.1", "dev": true, + "license": "MIT", "dependencies": { - "object.assign": "^4.1.0" + "browserslist": "^4.21.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/babel-plugin-emotion": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - } - }, - "node_modules/babel-plugin-emotion/node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "node_modules/babel-plugin-emotion/node_modules/@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "node_modules/babel-plugin-emotion/node_modules/babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "dependencies": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "node_modules/babel-plugin-emotion/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", + "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", - "yaml": "^1.7.2" + "yaml": "^1.10.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-emotion/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "node_modules/cp-file": { + "version": "10.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" + "graceful-fs": "^4.2.10", + "nested-error-stacks": "^2.1.1", + "p-event": "^5.0.1" }, "engines": { - "node": ">=10", - "npm": ">=6" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", + "node_modules/cpy": { + "version": "10.1.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" + "arrify": "^3.0.0", + "cp-file": "^10.0.0", + "globby": "^13.1.4", + "junk": "^4.0.1", + "micromatch": "^4.0.5", + "nested-error-stacks": "^2.1.1", + "p-filter": "^3.0.0", + "p-map": "^6.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } + "node_modules/crelt": { + "version": "1.0.6", + "license": "MIT" }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "node_modules/cross-env": { + "version": "7.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "cross-spawn": "^7.0.1" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" } }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", + "node_modules/cross-fetch": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node-fetch": "^2.6.12" } }, - "node_modules/babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "peerDependencies": { - "styled-components": ">= 2" + "engines": { + "node": ">= 8" } }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true + "node_modules/crypt": { + "version": "0.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "node_modules/crypto-random-string": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/babylon": { - "version": "7.0.0-beta.47", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", - "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==", - "bin": { - "babylon": "bin/babylon.js" + "type-fest": "^1.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "node_modules/css-box-model": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } }, - "node_modules/base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" }, - "node_modules/base64-arraybuffer-es6": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz", - "integrity": "sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==", + "node_modules/cssstyle": { + "version": "2.3.0", "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "node_modules/csstype": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.1", + "license": "ISC", "dependencies": { - "tweetnacl": "^0.14.3" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, - "node_modules/before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/dash-get": { + "version": "1.0.2", + "license": "MIT" }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 12" } }, - "node_modules/bin-links": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-3.0.1.tgz", - "integrity": "sha512-9vx+ypzVhASvHTS6K+YSGf7nwQdANoz7v6MTC0aCtYnOEZ87YvMf81aY737EZnGZdpbRM3sfWjO9oWkKmuIvyQ==", + "node_modules/data-urls": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/bind-event-listener": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-2.1.1.tgz", - "integrity": "sha512-O+a5c0D2se/u2VlBJmPRn45IB6R4mYMh1ok3dWxrIZ2pmLqzggBhb875mbq73508ylzofc0+hT9W41x4Y2s8lg==" - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "node_modules/decamelize": { + "version": "4.0.0", "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/decimal.js": { + "version": "10.4.3", "dev": true, + "license": "MIT" + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "node_modules/deep-eql": { + "version": "4.1.3", + "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "type-detect": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "node_modules/browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==", - "engines": [ - "node" - ] - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" }, - "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "node": ">=0.10.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "node_modules/defaults": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/byte-size": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz", - "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", - "dev": true, - "engines": { - "node": ">=10" + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, + "node_modules/deferred-leveldown": { + "version": "5.3.0", + "license": "MIT", + "optional": true, "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" + "abstract-leveldown": "~6.2.1", + "inherits": "^2.0.3" }, "engines": { - "node": ">=10.12.0" + "node": ">=6" } }, - "node_modules/c8/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/define-properties": { + "version": "1.2.0", + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/c8/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/delayed-stream": { + "version": "1.0.0", "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.4.0" } }, - "node_modules/c8/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/c8/node_modules/p-locate": { + "node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/diff": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.3.1" } }, - "node_modules/c8/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/diff-sequences": { + "version": "29.4.3", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cacache": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", - "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", + "node_modules/dir-glob": { + "version": "3.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "path-type": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "node_modules/dnd-core": { + "version": "14.0.1", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@react-dnd/asap": "^4.0.0", + "@react-dnd/invariant": "^2.0.0", + "redux": "^4.1.1" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" } }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/domexception": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, - "node_modules/camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001388", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", - "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/electron-to-chromium": { + "version": "1.4.496", "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/encoding-down": { + "version": "6.3.0", + "license": "MIT", + "optional": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "abstract-leveldown": "^6.2.1", + "inherits": "^2.0.3", + "level-codec": "^9.0.0", + "level-errors": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "node_modules/entities": { + "version": "2.1.0", + "license": "BSD-2-Clause", "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" + "node_modules/errno": { + "version": "0.1.8", + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" } }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/es-abstract": { + "version": "1.22.1", + "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 0.4" }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/es-iterator-helpers": { + "version": "1.0.13", "dev": true, - "engines": { - "node": ">=10" + "license": "MIT", + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.3", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.0", + "safe-array-concat": "^1.0.0" } }, - "node_modules/chromatism": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/chromatism/-/chromatism-2.6.0.tgz", - "integrity": "sha512-ZgkGBXc0b0X7KW26aHIuwQvg6MFt47ehRg+YqcmLtGtHPmn6+5sx9uAFTLHcmsg9kYjOcFJYc/U2n06wrZ7KTA==" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" + "node_modules/es-module-shims": { + "version": "1.4.3", + "license": "MIT" }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/es-shim-unscopables": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" + "has": "^1.0.3" } }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, + "node_modules/es5-ext": { + "version": "0.10.62", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, "engines": { - "node": ">= 10" + "node": ">=0.10" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/es6-iterator": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", "dev": true, + "license": "MIT" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "node_modules/esbuild": { + "version": "0.18.11", "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=0.8" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "node_modules/escalade": { + "version": "3.1.1", "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cmd-shim": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", - "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", + "node_modules/escodegen": { + "version": "2.1.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "mkdirp-infer-owner": "^2.0.0" + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "dependencies": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, + "license": "BSD-3-Clause", + "optional": true, "engines": { - "node": ">= 4.0" + "node": ">=0.10.0" } }, - "node_modules/coa/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/eslint": { + "version": "8.47.0", "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "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": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/coa/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/eslint-config-react-app": { + "version": "7.0.1", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" } }, - "node_modules/coa/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/coa/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/coa/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/coa/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/eslint-module-utils": { + "version": "2.8.0", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "debug": "^3.2.7" }, "engines": { "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" + "ms": "^2.1.1" } }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "dev": true, + "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { - "node": ">= 0.8" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", "dependencies": { - "array-back": "^3.0.1", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" + "ms": "^2.1.1" } }, - "node_modules/command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" + "esutils": "^2.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "dev": true, + "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "@typescript-eslint/experimental-utils": "^5.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "engines": { - "node": ">=8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } } }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/eslint-plugin-react": { + "version": "7.33.2", + "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.8" }, "engines": { "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", "dev": true, + "license": "Apache-2.0", "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/compare-func/node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", "dev": true, + "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=8" + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", "dev": true, - "engines": [ - "node >= 6.0" - ], + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" } }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "node_modules/eslint-scope": { + "version": "7.2.2", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" + "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/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", "dev": true, + "license": "Apache-2.0", "engines": { - "node": ">=0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "engines": { - "node": ">=10" - } + "license": "MIT" }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", + "node_modules/eslint/node_modules/globals": { + "version": "13.21.0", "dev": true, + "license": "MIT", "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "node_modules/espree": { + "version": "9.6.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/convert-source-map/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/core-js": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", - "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", - "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.3", - "semver": "7.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/eslint" } }, - "node_modules/core-js-compat/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "node_modules/esprima": { + "version": "4.0.1", "dev": true, + "license": "BSD-2-Clause", "bin": { - "semver": "bin/semver.js" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, - "node_modules/core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", + "node_modules/esquery": { + "version": "1.5.0", "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "license": "BSD-3-Clause", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=10" + "node": ">=0.10" } }, - "node_modules/cp-file": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", - "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", + "node_modules/esrecurse": { + "version": "4.3.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/cpy": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", - "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", + "node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "dependencies": { - "arrify": "^3.0.0", - "cp-file": "^9.1.0", - "globby": "^13.1.1", - "junk": "^4.0.0", - "micromatch": "^4.0.4", - "nested-error-stacks": "^2.1.0", - "p-filter": "^3.0.0", - "p-map": "^5.3.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": "^12.20.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/cpy/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "node_modules/estree-walker": { + "version": "2.0.2", "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/cpy/node_modules/arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "node_modules/events": { + "version": "3.3.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.x" } }, - "node_modules/cpy/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "node_modules/execa": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "escape-string-regexp": "5.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=12" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/cpy/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/exenv": { + "version": "1.2.2", + "license": "BSD-3-Clause" + }, + "node_modules/ext": { + "version": "1.7.0", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8.6.0" } }, - "node_modules/cpy/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", "dev": true, + "license": "ISC", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "is-glob": "^4.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/cpy/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" } }, - "node_modules/cpy/node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "node_modules/fbjs": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "cross-fetch": "^3.1.5", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^1.0.35" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/fbjs/node_modules/cross-fetch": { + "version": "3.1.8", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", "dependencies": { - "aggregate-error": "^4.0.0" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.20 || >= 14.13" } }, - "node_modules/cpy/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "node_modules/file-entry-cache": { + "version": "6.0.1", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "minimatch": "^5.0.1" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "node_modules/filelist/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": { - "node-fetch": "2.6.7" + "balanced-match": "^1.0.0" } }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, + "node_modules/final-form": { + "version": "4.20.10", + "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" + "@babel/runtime": "^7.10.0" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/final-form" } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/final-form-focus": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "final-form": ">=1.3.0" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { "node": ">=10" }, @@ -8714,395 +7292,303 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "tiny-invariant": "^1.0.6" + "micromatch": "^4.0.2" } }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "engines": { - "node": ">=4" + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" } }, - "node_modules/css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "node_modules/flat-cache": { + "version": "3.0.4", "dev": true, + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" }, - "node_modules/css-to-react-native": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", - "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", + "node_modules/focus-lock": { + "version": "0.11.6", + "license": "MIT", "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^3.3.0" + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" } }, - "node_modules/css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, + "node_modules/focus-trap": { + "version": "2.4.6", + "license": "MIT", "dependencies": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" + "tabbable": "^1.0.3" } }, - "node_modules/css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node_modules/focus-trap/node_modules/tabbable": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" } }, - "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "node_modules/foreground-child": { + "version": "2.0.0", "dev": true, + "license": "ISC", "dependencies": { - "css-tree": "^1.1.2" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "node_modules/form-data": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=8.0.0" + "node": ">= 6" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", "dev": true, + "license": "MIT", "dependencies": { - "cssom": "~0.3.6" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">=8" + "node": ">=12.20.0" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" - }, - "node_modules/d3-hexbin": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", - "integrity": "sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, + "node_modules/fractional-indexing": { + "version": "2.1.0", + "license": "CC0-1.0", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/fs-extra": { + "version": "10.1.0", + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", + "node_modules/fs-minipass": { + "version": "2.1.0", "dev": true, + "license": "ISC", "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" + "minipass": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/data-urls/node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", "dev": true, + "license": "ISC", "dependencies": { - "punycode": "^2.1.1" + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/data-urls/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "engines": { - "node": ">=12" - } + "license": "ISC" }, - "node_modules/data-urls/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "node_modules/fs.realpath": { + "version": "1.0.0", "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } + "license": "ISC" }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "node_modules/fsevents": { + "version": "2.3.2", "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "*" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "dev": true, - "engines": { - "node": "*" + "node_modules/functions-have-names": { + "version": "1.2.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", + "node_modules/get-caller-file": { + "version": "2.0.5", "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, + "license": "ISC", "engines": { - "node": ">=0.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/get-func-name": { + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "node_modules/decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "license": "MIT", "dependencies": { - "character-entities": "^2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, - "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "node_modules/get-stream": { + "version": "6.0.1", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=0.12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "dev": true, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/glob": { + "version": "7.2.3", "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, + "license": "ISC", "dependencies": { - "clone": "^1.0.2" + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "node_modules/globalthis": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "define-properties": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -9111,2128 +7597,1733 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "node_modules/globby": { + "version": "13.2.2", "dev": true, + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, "engines": { - "node": ">= 0.6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "node_modules/graphemer": { + "version": "1.4.0", "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } + "license": "MIT" }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.3.1" + "node": ">=4.x" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "function-bind": "^1.1.1" }, "engines": { - "node": ">=8" + "node": ">= 0.4.0" } }, - "node_modules/dnd-core": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.7.0.tgz", - "integrity": "sha512-+YqwflWEY1MEAEl2QiEiRaglYkCwIZryyQwximQGuTOm/ns7fS6Lg/i7OCkrtjM10D5FhArf/VUHIL4ZaRBK0g==", - "peer": true, - "dependencies": { - "asap": "^2.0.6", - "invariant": "^2.2.4", - "redux": "^4.0.1" + "node_modules/has-bigints": { + "version": "1.0.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/doctrine": { + "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "node": ">=4" } }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "webidl-conversions": "^7.0.0" + "get-intrinsic": "^1.1.1" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "is-obj": "^2.0.0" + "has-symbols": "^1.0.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true, - "engines": { - "node": ">=10" + "node_modules/hast-util-embedded": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, + "node_modules/hast-util-from-dom": { + "version": "4.2.0", + "license": "ISC", "dependencies": { - "minimatch": "^3.0.4" + "hastscript": "^7.0.0", + "web-namespaces": "^2.0.0" }, - "bin": { - "ignored": "bin/ignored" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "license": "MIT", "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/electron-to-chromium": { - "version": "1.4.240", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", - "integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" + "node_modules/hast-util-has-property": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "node_modules/hast-util-is-body-ok-link": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "iconv-lite": "^0.6.2" + "@types/hast": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/hast-util-is-element": { + "version": "2.1.3", + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "license": "MIT", "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" + "@types/hast": "^2.0.0" }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/hast-util-phrasing": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-embedded": "^2.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-body-ok-link": "^2.0.0", + "hast-util-is-element": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" + "node_modules/hast-util-raw": { + "version": "7.2.3", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "license": "MIT" }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", + "node_modules/hast-util-to-mdast": { + "version": "8.4.1", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@types/extend": "^3.0.0", + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "extend": "^3.0.0", + "hast-util-has-property": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-phrasing": "^2.0.0", + "hast-util-to-text": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "rehype-minify-whitespace": "^5.0.0", + "trim-trailing-lines": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit": "^4.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/es-module-shims": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.4.3.tgz", - "integrity": "sha512-qMUb+8lrpqZ6jW/kelQU7XD1hR71hmxKhIDmmVwsQNQaAYh0fzErnKSj9Xi80L0ubEjnzCDD5ha7oZehkwFApg==" - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, + "node_modules/hast-util-to-text": { + "version": "3.1.2", + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "unist-util-find-after": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "node_modules/hast-util-whitespace": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/esbuild": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.6.tgz", - "integrity": "sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w==", + "node_modules/he": { + "version": "1.2.0", "dev": true, - "hasInstallScript": true, - "peer": true, + "license": "MIT", "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.6", - "esbuild-android-64": "0.15.6", - "esbuild-android-arm64": "0.15.6", - "esbuild-darwin-64": "0.15.6", - "esbuild-darwin-arm64": "0.15.6", - "esbuild-freebsd-64": "0.15.6", - "esbuild-freebsd-arm64": "0.15.6", - "esbuild-linux-32": "0.15.6", - "esbuild-linux-64": "0.15.6", - "esbuild-linux-arm": "0.15.6", - "esbuild-linux-arm64": "0.15.6", - "esbuild-linux-mips64le": "0.15.6", - "esbuild-linux-ppc64le": "0.15.6", - "esbuild-linux-riscv64": "0.15.6", - "esbuild-linux-s390x": "0.15.6", - "esbuild-netbsd-64": "0.15.6", - "esbuild-openbsd-64": "0.15.6", - "esbuild-sunos-64": "0.15.6", - "esbuild-windows-32": "0.15.6", - "esbuild-windows-64": "0.15.6", - "esbuild-windows-arm64": "0.15.6" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.6.tgz", - "integrity": "sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=12" + "he": "bin/he" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.6.tgz", - "integrity": "sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw==", - "cpu": [ - "arm64" - ], + "node_modules/highlight.js": { + "version": "9.18.5", "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=12" + "node": "*" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.6.tgz", - "integrity": "sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw==", - "cpu": [ - "x64" - ], + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.6.tgz", - "integrity": "sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA==", - "cpu": [ - "arm64" - ], + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=12" + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.6.tgz", - "integrity": "sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg==", - "cpu": [ - "x64" - ], + "node_modules/http-proxy-agent": { + "version": "5.0.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.6.tgz", - "integrity": "sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw==", - "cpu": [ - "arm64" - ], + "node_modules/https-proxy-agent": { + "version": "5.0.1", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=12" + "node": ">= 6" } }, - "node_modules/esbuild-linux-32": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.6.tgz", - "integrity": "sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg==", - "cpu": [ - "ia32" - ], + "node_modules/human-signals": { + "version": "4.3.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=14.18.0" } }, - "node_modules/esbuild-linux-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz", - "integrity": "sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A==", - "cpu": [ - "x64" - ], + "node_modules/iconv-lite": { + "version": "0.6.3", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.6.tgz", - "integrity": "sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ==", - "cpu": [ - "arm" + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 4" } }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.6.tgz", - "integrity": "sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": 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", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.6.tgz", - "integrity": "sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw==", - "cpu": [ - "mips64el" - ], + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.8.19" } }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.6.tgz", - "integrity": "sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw==", - "cpu": [ - "ppc64" - ], + "node_modules/indent-string": { + "version": "5.0.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "MIT", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.6.tgz", - "integrity": "sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw==", - "cpu": [ - "riscv64" - ], + "node_modules/inflight": { + "version": "1.0.6", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=12" + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.6.tgz", - "integrity": "sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "node_modules/inherits": { + "version": "2.0.4", + "devOptional": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.6.tgz", - "integrity": "sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA==", - "cpu": [ - "x64" - ], + "node_modules/is-arguments": { + "version": "1.1.1", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.6.tgz", - "integrity": "sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=12" + "node_modules/is-array-buffer": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.6.tgz", - "integrity": "sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg==", - "cpu": [ - "x64" - ], + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.6.tgz", - "integrity": "sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=12" + "node_modules/is-bigint": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-windows-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.6.tgz", - "integrity": "sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg==", - "cpu": [ - "x64" - ], + "node_modules/is-binary-path": { + "version": "2.1.0", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.6.tgz", - "integrity": "sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/is-buffer": { + "version": "1.1.6", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escape-string-regexp": { + "node_modules/is-core-module": { + "version": "2.13.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "node_modules/is-docker": { + "version": "2.2.1", "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, + "license": "MIT", "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "is-docker": "cli.js" }, "engines": { - "node": ">=6.0" + "node": ">=8" }, - "optionalDependencies": { - "source-map": "~0.6.1" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, + "node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "is-plain-object": "^2.0.4" }, "engines": { - "node": ">= 0.8.0" + "node": ">=0.10.0" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "call-bind": "^1.0.2" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "node_modules/is-generator-function": { + "version": "1.0.10", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=0.10.0" } }, - "node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "node_modules/is-interactive": { + "version": "2.0.0", "dev": true, - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=12" }, - "peerDependencies": { - "eslint": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "node_modules/is-map": { + "version": "2.0.2", "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "node_modules/is-nan": { + "version": "1.3.2", "dev": true, + "license": "MIT", "dependencies": { - "debug": "^3.2.7" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" }, "engines": { - "node": ">=4" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" + "node_modules/is-negative-zero": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "node_modules/is-number": { + "version": "7.0.0", "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "license": "MIT", "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/is-path-inside": { + "version": "3.0.3", "dev": true, - "dependencies": { - "ms": "2.0.0" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { + "node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "isobject": "^3.0.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "node_modules/is-retina": { + "version": "1.0.3", + "license": "MIT" }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/is-set": { + "version": "2.0.2", "dev": true, - "bin": { - "semver": "bin/semver.js" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", - "dev": true, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "engines": { - "node": ">=4" + "call-bind": "^1.0.2" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "node_modules/is-stream": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, + "node_modules/is-string": { + "version": "1.0.7", + "license": "MIT", "dependencies": { - "esutils": "^2.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, + "node_modules/is-symbol": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "has-symbols": "^1.0.2" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz", - "integrity": "sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw==", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.12", + "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^5.13.0" + "which-typed-array": "^1.1.11" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" + "node": ">= 0.4" }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/is-weakmap": { + "version": "2.0.1", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "call-bind": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, - "peerDependencies": { - "eslint": ">=5" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/is-wsl": { + "version": "2.2.0", "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/isarray": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/isomorphic.js": { + "version": "0.2.5", + "license": "MIT", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "p-locate": "^5.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/istanbul-reports": { + "version": "3.1.6", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "p-limit": "^3.0.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/iterator.prototype": { + "version": "1.1.0", "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "has-tostringtag": "^1.0.0", + "reflect.getprototypeof": "^1.0.3" } }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dev": true, "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "jake": "bin/cli.js" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "estraverse": "^5.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "estraverse": "^5.2.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=4.0" + "node": ">=7.0.0" } }, - "node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">=8" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "@types/node": "*", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "supports-color": "^7.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">= 10.13.0" } }, - "node_modules/exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" }, - "node_modules/fake-indexeddb": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-3.1.8.tgz", - "integrity": "sha512-7umIgcdnDfNcjw0ZaoD6yR2BflngKmPsyzZC+sV2fdttwz5bH6B6CCaNzzD+MURfRg8pvr/aL0trfNx65FLiDg==", + "node_modules/js-yaml": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "realistic-structured-clone": "^2.0.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "node_modules/jsdom": { + "version": "20.0.3", "dev": true, + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" + "node_modules/jsdom/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "dependencies": { - "format": "^0.2.0" + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=4" } }, - "node_modules/fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "dependencies": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" }, - "node_modules/fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/jsonc-parser": { + "version": "3.2.0", "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "universalify": "^2.0.0" }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/filebridge-client": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/filebridge-client/-/filebridge-client-0.1.5.tgz", - "integrity": "sha512-M+RUw+7mufI8IQ+cgiWAmXYmm4kGdABLKHdVgdv0gkNwCc3SNzqbY7d91NMemN9jeCZa0+xLzH/tEfuzEQo65A==", - "dependencies": { - "vscode-lib": "^0.1.2" + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" }, "engines": { - "node": ">=8" + "node": ">=4.0" } }, - "node_modules/final-form": { - "version": "4.20.7", - "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.7.tgz", - "integrity": "sha512-ii3X9wNfyBYFnDPunYN5jh1/HAvtOZ9aJI/TVk0MB86hZuOeYkb+W5L3icgwW9WWNztZR6MDU3En6eoZTUoFPg==", - "dependencies": { - "@babel/runtime": "^7.10.0" + "node_modules/junk": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/final-form" - } - }, - "node_modules/final-form-focus": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/final-form-focus/-/final-form-focus-1.1.2.tgz", - "integrity": "sha512-Gd+Bd2Ll7ijo3/sd6kJ/bwLkhc2bUJPxTON6fIqee/008EJpACWhT+zoWCm9q6NcfMcWRS+Sp5ikRX8iqdXeGQ==", - "peerDependencies": { - "final-form": ">=1.3.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" + "graceful-fs": "^4.1.11" } }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "node_modules/kleur": { + "version": "4.1.5", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "node_modules/language-subtag-registry": { + "version": "0.3.22", "dev": true, - "dependencies": { - "micromatch": "^4.0.2" - } + "license": "CC0-1.0" }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "node_modules/language-tags": { + "version": "1.0.5", "dev": true, - "bin": { - "flat": "cli.js" + "license": "MIT", + "dependencies": { + "language-subtag-registry": "~0.3.2" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, + "node_modules/level": { + "version": "6.0.1", + "license": "MIT", + "optional": true, "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "level-js": "^5.0.0", + "level-packager": "^5.1.0", + "leveldown": "^5.4.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=8.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/focus-lock": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.2.tgz", - "integrity": "sha512-pZ2bO++NWLHhiKkgP1bEXHhR1/OjVcSvlCJ98aNJDFeb7H5OOQaO+SKOZle6041O9rv2tmbrO4JzClAvDUHf0g==", + "node_modules/level-codec": { + "version": "9.0.2", + "license": "MIT", + "optional": true, "dependencies": { - "tslib": "^2.0.3" + "buffer": "^5.6.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/focus-trap": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.6.tgz", - "integrity": "sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg==", + "node_modules/level-codec/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, "dependencies": { - "tabbable": "^1.0.3" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" + "node_modules/level-concat-iterator": { + "version": "2.0.1", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=6" } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, + "node_modules/level-errors": { + "version": "2.0.1", + "license": "MIT", + "optional": true, "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "errno": "~0.1.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, + "node_modules/level-iterator-stream": { + "version": "4.0.2", + "license": "MIT", + "optional": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "inherits": "^2.0.4", + "readable-stream": "^3.4.0", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", - "engines": { - "node": ">=0.4.x" + "node": ">=6" } }, - "node_modules/fractional-indexing": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-2.1.0.tgz", - "integrity": "sha512-4tIVui+5dxsXe/BG7D9EzgNIDK9fEoBzjvAf9gFfxFDPo2LsPSjfFKB2QmtcvmioD2IlshtcJFXGEcDPTG6R/A==", - "engines": { - "node": ">=12" + "node_modules/level-js": { + "version": "5.0.2", + "license": "MIT", + "optional": true, + "dependencies": { + "abstract-leveldown": "~6.2.3", + "buffer": "^5.5.0", + "inherits": "^2.0.3", + "ltgt": "^2.1.2" } }, - "node_modules/frontend-collective-react-dnd-scrollzone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", - "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", + "node_modules/level-js/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "optional": true, "dependencies": { - "hoist-non-react-statics": "^3.1.0", - "lodash.throttle": "^4.0.1", - "prop-types": "^15.5.9", - "raf": "^3.2.0", - "react": "^16.3.0", - "react-display-name": "^0.2.0", - "react-dom": "^16.3.0" - }, - "peerDependencies": { - "react-dnd": "^7.3.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, + "node_modules/level-packager": { + "version": "5.1.1", + "license": "MIT", + "optional": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "encoding-down": "^6.3.0", + "levelup": "^4.3.2" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, + "node_modules/level-supports": { + "version": "1.0.1", + "license": "MIT", + "optional": true, "dependencies": { - "minipass": "^3.0.0" + "xtend": "^4.0.2" }, "engines": { - "node": ">= 8" + "node": ">=6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, + "node_modules/leveldown": { + "version": "5.6.0", "hasInstallScript": true, + "license": "MIT", "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "abstract-leveldown": "~6.2.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "~4.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.6.0" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/leveldown/node_modules/node-gyp-build": { + "version": "4.1.1", + "license": "MIT", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" } }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, + "node_modules/levelup": { + "version": "4.4.0", + "license": "MIT", + "optional": true, "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" + "deferred-leveldown": "~5.3.0", + "level-errors": "~2.0.0", + "level-iterator-stream": "~4.0.0", + "level-supports": "~1.0.0", + "xtend": "~4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" + "node": ">=6" } }, - "node_modules/get-browser-rtc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", - "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=6" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "node_modules/levn": { + "version": "0.4.1", "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": "*" + "node": ">= 0.8.0" } }, - "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "node_modules/lib0": { + "version": "0.2.82", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.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/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "node_modules/lilconfig": { + "version": "2.1.0", "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=10" } }, - "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "uc.micro": "^1.0.1" } }, - "node_modules/get-pkg-repo/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/linkifyjs": { + "version": "4.1.1", + "license": "MIT" }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/local-pkg": { + "version": "0.4.3", "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, + "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": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "lie": "3.1.1" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "node_modules/locate-path": { + "version": "6.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, "engines": { "node": ">=10" }, @@ -11240,27281 +9331,6589 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "engines": { - "node": ">=0.10.0" + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/git-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz", - "integrity": "sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==", - "dev": true, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^7.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/git-url-parse": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz", - "integrity": "sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==", + "node_modules/loupe": { + "version": "2.3.6", "dev": true, + "license": "MIT", "dependencies": { - "git-up": "^6.0.0" + "get-func-name": "^2.0.0" } }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "node_modules/lru-cache": { + "version": "5.1.1", "dev": true, + "license": "ISC", "dependencies": { - "ini": "^1.3.2" + "yallist": "^3.0.2" } }, - "node_modules/github-buttons": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.22.0.tgz", - "integrity": "sha512-N5bk01s1WgK1FVtoeSUVkRkJpkaSu8yHMPcjye+PTa0jsRjMRNrYqVLgpUf2RA5Kvec05DfHYAT6/68fwkdqPw==" + "node_modules/ltgt": { + "version": "2.2.1", + "license": "MIT", + "optional": true }, - "node_modules/gl-matrix": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" + "node_modules/lz-string": { + "version": "1.5.0", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } }, - "node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/magic-string": { + "version": "0.30.2", "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "semver": "^7.5.3" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/glob/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": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", "dev": true, + "license": "ISC", "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" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "engines": { - "node": ">=4.x" - } + "license": "ISC" }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==", - "engines": { - "node": ">=0.8.0" - } + "node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, + "node_modules/markdown-it": { + "version": "12.3.2", + "license": "MIT", "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" }, "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "markdown-it": "bin/markdown-it.js" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" + "node_modules/markdown-table": { + "version": "3.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/matchit": { + "version": "1.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "@arr/every": "^1.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/md5": { + "version": "2.3.0", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/mdast-util-definitions": { + "version": "5.1.2", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-dynamic-import": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", - "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", - "dev": true, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/mdast-util-from-markdown": { + "version": "1.3.1", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "mdast-util-to-string": "^3.1.0", + "micromark": "^3.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-decode-string": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "unist-util-stringify-position": "^3.0.0", + "uvu": "^0.5.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/highlight.js": { - "version": "9.18.5", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", - "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", - "deprecated": "Support has ended for 9.x series. Upgrade to @latest", - "dev": true, - "hasInstallScript": true, - "engines": { - "node": "*" + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.7.6" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "license": "MIT", "dependencies": { - "react-is": "^16.7.0" + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, + "node_modules/mdast-util-phrasing": { + "version": "3.0.1", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "@types/mdast": "^3.0.0", + "unist-util-is": "^5.0.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "license": "MIT", "dependencies": { - "whatwg-encoding": "^2.0.0" + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" }, - "engines": { - "node": ">=12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, + "node_modules/mdast-util-to-markdown": { + "version": "1.5.0", + "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^3.0.0", + "mdast-util-to-string": "^3.0.0", + "micromark-util-decode-string": "^1.0.0", + "unist-util-visit": "^4.0.0", + "zwitch": "^2.0.0" }, - "engines": { - "node": ">= 6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@types/mdast": "^3.0.0" }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/mdurl": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/merge-options": { + "version": "3.0.4", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" + "node": ">=10" } }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "node_modules/merge-stream": { + "version": "2.0.0", "dev": true, - "dependencies": { - "ms": "^2.0.0" - } + "license": "MIT" }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "node_modules/micromark": { + "version": "3.2.0", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "OpenCollective", + "url": "https://opencollective.com/unified" } - ] - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" } }, - "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ignore-walk/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, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, - "engines": { - "node": ">=10" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "license": "MIT", "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" + "micromark-util-types": "^1.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/micromark-factory-destination": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "node_modules/micromark-factory-label": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/init-package-json": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", - "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", - "dev": true, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/init-package-json/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, + "node_modules/micromark-factory-title": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/init-package-json/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, + "node_modules/micromark-factory-whitespace": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12.0.0" + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "node_modules/micromark-util-chunked": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/intl-messageformat": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz", - "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==", + "node_modules/micromark-util-classify-character": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/fast-memoize": "1.2.1", - "@formatjs/icu-messageformat-parser": "2.1.0", - "tslib": "^2.1.0" + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, + "node_modules/micromark-util-combine-extensions": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "loose-envify": "^1.0.0" + "micromark-util-chunked": "^1.0.0", + "micromark-util-types": "^1.0.0" } }, - "node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/micromark-util-decode-string": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/micromark-util-encode": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" + "micromark-util-symbol": "^1.0.0" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "node_modules/micromark-util-resolve-all": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "micromark-util-types": "^1.0.0" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "node_modules/micromark-util-sanitize-uri": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-symbol": "^1.0.0" + } }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/micromark-util-subtokenize": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.5", "dev": true, + "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=8.6" } }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/mimic-fn": { + "version": "4.0.0", "dev": true, - "bin": { - "is-docker": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">=0.10.0" + "node": "*" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/minimist": { + "version": "1.2.8", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", "engines": { "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/minizlib": { + "version": "2.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "ISC" }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" + "node_modules/mkdirp": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { - "node": ">=0.12.0" + "node": ">=10" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/mlly": { + "version": "1.4.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/mobx": { + "version": "6.10.0", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/mobx" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node_modules/mobx-react-lite": { + "version": "3.4.3", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.1.0", + "react": "^16.8.0 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "node_modules/mocha": { + "version": "9.2.2", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">= 0.4" + "node": ">= 12.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/is-retina": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", - "integrity": "sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==" - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "ms": "2.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", "dev": true, - "dependencies": { - "protocols": "^2.0.1" - } + "license": "MIT" }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "license": "ISC", "dependencies": { - "has-tostringtag": "^1.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", "dependencies": { - "has-symbols": "^1.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "*" } }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", "dev": true, + "license": "ISC", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=10" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/monaco-editor": { + "version": "0.35.0", + "license": "MIT" }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/mri": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "node_modules/mrmime": { + "version": "1.0.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=10" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, - "dependencies": { - "is-docker": "^2.0.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { + "node_modules/napi-macros": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "license": "MIT", + "optional": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", - "dependencies": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - } + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/isomorphic-fetch/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "dev": true, + "license": "MIT" }, - "node_modules/isomorphic-fetch/node_modules/node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dependencies": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } + "node_modules/next-tick": { + "version": "1.1.0", + "license": "ISC" }, - "node_modules/isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/node-domexception": { + "version": "1.0.0", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10.5.0" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, + "node_modules/node-fetch": { + "version": "2.6.13", + "license": "MIT", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "node": "4.x || >=6.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "node_modules/node-gyp-build": { + "version": "4.6.0", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } }, - "node_modules/jsdom": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", - "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", + "node_modules/node-releases": { + "version": "2.0.13", "dev": true, - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.7.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "^7.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.8.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/jsdom/node_modules/tr46": { + "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/jsdom/node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", "dev": true, + "license": "ISC", "engines": { - "node": ">=12" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/jsdom/node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "node_modules/npm-run-path": { + "version": "5.1.0", "dev": true, + "license": "MIT", "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-bignum": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==", + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "node_modules/nwsapi": { + "version": "2.2.7", + "dev": true, + "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, + "node_modules/object-inspect": { + "version": "1.12.3", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "node_modules/object-is": { + "version": "1.1.5", + "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/object.assign": { + "version": "4.1.4", + "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "node_modules/object.entries": { + "version": "1.1.6", "dev": true, + "license": "MIT", "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": "*" + "node": ">= 0.4" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/object.fromentries": { + "version": "2.0.6", + "dev": true, + "license": "MIT", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=0.6.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "node_modules/object.groupby": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" } }, - "node_modules/junk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.0.tgz", - "integrity": "sha512-ojtSU++zLJ3jQG9bAYjg94w+/DOJtRyD7nPaerMFrBhmdVmiV5/exYH5t4uHga4G/95nT6hr1OJoKIFbYbrW5w==", + "node_modules/object.hasown": { + "version": "1.1.2", "dev": true, - "engines": { - "node": ">=12.20" + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/just-diff": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.0.3.tgz", - "integrity": "sha512-a8p80xcpJ6sdurk5PxDKb4mav9MeKjA3zFKZpCWBIfvg8mznfnmb13MKZvlrwJ+Lhis0wM3uGAzE0ArhFHvIcg==", - "dev": true - }, - "node_modules/just-diff-apply": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.3.1.tgz", - "integrity": "sha512-dgFenZnMsc1xGNqgdtgnh7DK+Oy352CE3VZLbzcbQpsBs9iI2K3M0IRrdgREZ72eItTjbl0suRyvKRdVQa9GbA==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, + "node_modules/object.omit": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "is-extendable": "^1.0.0" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.11" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "isobject": "^3.0.1" + }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "node_modules/object.values": { + "version": "1.1.6", "dev": true, + "license": "MIT", "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/lerna": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.3.0.tgz", - "integrity": "sha512-0Y9xJqleVu0ExGmsw2WM/GkVmxOwtA7OLQFS5ERPKJfnsxH9roTX3a7NPaGQRI2E+tSJLJJGgNSf3WYEqinOqA==", - "dev": true, - "dependencies": { - "@lerna/add": "5.3.0", - "@lerna/bootstrap": "5.3.0", - "@lerna/changed": "5.3.0", - "@lerna/clean": "5.3.0", - "@lerna/cli": "5.3.0", - "@lerna/create": "5.3.0", - "@lerna/diff": "5.3.0", - "@lerna/exec": "5.3.0", - "@lerna/import": "5.3.0", - "@lerna/info": "5.3.0", - "@lerna/init": "5.3.0", - "@lerna/link": "5.3.0", - "@lerna/list": "5.3.0", - "@lerna/publish": "5.3.0", - "@lerna/run": "5.3.0", - "@lerna/version": "5.3.0", - "import-local": "^3.0.2", - "npmlog": "^6.0.2", - "nx": ">=14.4.3 < 16" - }, - "bin": { - "lerna": "cli.js" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/once": { + "version": "1.4.0", "dev": true, + "license": "ISC", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "wrappy": "1" } }, - "node_modules/lib0": { - "version": "0.2.52", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.52.tgz", - "integrity": "sha512-CjxlM7UgICfN6b2OPALBXchIBiNk6jE+1g7JP8ha+dh1xKRDSYpH0WQl1+rMqCju49xUnwPG34v4CR5/rPOZhg==", + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "isomorphic.js": "^0.2.4" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=12" }, "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/libnpmaccess": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.3.tgz", - "integrity": "sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg==", + "node_modules/open": { + "version": "7.4.2", "dev": true, + "license": "MIT", "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/libnpmaccess/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "node_modules/optionator": { + "version": "0.9.3", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">= 0.8.0" } }, - "node_modules/libnpmaccess/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "node_modules/ora": { + "version": "6.3.1", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/libnpmpublish": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.4.tgz", - "integrity": "sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg==", + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", "dev": true, - "dependencies": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/libnpmpublish/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/libnpmpublish/node_modules/normalize-package-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", - "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/libnpmpublish/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "node_modules/p-event": { + "version": "5.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "uc.micro": "^1.0.1" + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/linkifyjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", - "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==" - }, - "node_modules/load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "node_modules/p-filter": { + "version": "3.0.0", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" + "p-map": "^5.1.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/load-json-file/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/p-filter/node_modules/p-map": { + "version": "5.5.0", "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "node_modules/p-limit": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=8.9.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loader-utils/node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "node_modules/p-locate": { + "version": "5.0.0", "dev": true, - "bin": { - "json5": "lib/cli.js" + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", + "node_modules/p-map": { + "version": "6.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/p-timeout": { + "version": "5.1.0", "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "node_modules/p-wait-for": { + "version": "5.0.2", "dev": true, + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "p-timeout": "^6.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "node_modules/p-wait-for/node_modules/p-timeout": { + "version": "6.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=14.16" }, "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { - "node": ">=0.6" + "node": ">=6" } }, - "node_modules/longest-streak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", - "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", + "node_modules/parse5": { + "version": "7.1.2", "dev": true, + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" + "entities": "^4.4.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/lowlight/node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "engines": { - "node": "*" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz", - "integrity": "sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA==", + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=12" - } - }, - "node_modules/lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==", - "bin": { - "lz-string": "bin/bin.js" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/magic-string": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", - "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", + "node_modules/patch-package": { + "version": "7.0.2", "dev": true, + "license": "MIT", "dependencies": { - "sourcemap-codec": "^1.4.8" + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" }, "engines": { - "node": ">=12" + "node": ">=14", + "npm": ">5" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^6.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/make-fetch-happen": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz", - "integrity": "sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg==", + "node_modules/patch-package/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/matchit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.1.0.tgz", - "integrity": "sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==", + "node_modules/patch-package/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "@arr/every": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=6" - } - }, - "node_modules/math.gl": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/math.gl/-/math.gl-3.6.3.tgz", - "integrity": "sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==", - "dependencies": { - "@math.gl/core": "3.6.3" - } - }, - "node_modules/matrix-crdt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/matrix-crdt/-/matrix-crdt-0.2.0.tgz", - "integrity": "sha512-CmwC7/Wtujq6Jp1+MbIY0noEgGnT7YKl3lSOAtzIpDRyNPghHRxtgrDh+IR1kxsf/kFKWqxjgezzlG2vkUhGyA==", - "dependencies": { - "another-json": "^0.2.0", - "lodash": "^4.17.21", - "simple-peer": "^9.11.0", - "vscode-lib": "^0.1.0" - }, - "peerDependencies": { - "lib0": "*", - "matrix-js-sdk": "*", - "y-protocols": "*", - "yjs": "*" + "node": ">=7.0.0" } }, - "node_modules/matrix-events-sdk": { - "version": "0.0.1-beta.7", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz", - "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" }, - "node_modules/matrix-js-sdk": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.4.0.tgz", - "integrity": "sha512-B8Mm4jCsCHaMaChcdM3VhZDVKrn0nMSDtYvHmS15Iu8Pe0G4qmIpk2AoADBAL9U9yN3pCqvs3TDXaQhM8UxRRA==", + "node_modules/patch-package/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "@babel/runtime": "^7.12.5", - "another-json": "^0.2.0", - "browser-request": "^0.3.3", - "bs58": "^5.0.0", - "content-type": "^1.0.4", - "loglevel": "^1.7.1", - "matrix-events-sdk": "^0.0.1-beta.7", - "p-retry": "4", - "qs": "^6.9.6", - "request": "^2.88.2", - "unhomoglyph": "^1.0.6" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=12.9.0" + "node": ">=10" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" + "node_modules/patch-package/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", + "node_modules/patch-package/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" + "yallist": "^4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10" } }, - "node_modules/mdast-util-to-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", - "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "glob": "^7.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "node_modules/patch-package/node_modules/semver": { + "version": "7.5.4", "dev": true, + "license": "ISC", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/patch-package/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/patch-package/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, + "license": "ISC" + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.3.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/path-is-absolute": { + "version": "1.0.1", "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "node_modules/pathe": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/penpal": { + "version": "6.2.2", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", "dev": true, + "license": "MIT", "dependencies": { - "is-plain-obj": "^2.1.0" + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/playwright": { + "version": "1.37.1", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.37.1" + }, + "bin": { + "playwright": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=16" } }, - "node_modules/merge-options/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/playwright-core": { + "version": "1.37.1", "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, "engines": { - "node": ">=8" + "node": ">=16" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/playwright-test": { + "version": "11.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-loose": "^8.3.0", + "assert": "^2.0.0", + "buffer": "^6.0.3", + "c8": "^8.0.0", + "camelcase": "^7.0.1", + "chokidar": "^3.5.3", + "cpy": "^10.1.0", + "esbuild": "0.18.11", + "events": "^3.3.0", + "execa": "^7.1.1", + "globby": "^13.2.1", + "kleur": "^4.1.5", + "lilconfig": "^2.1.0", + "lodash": "^4.17.21", + "merge-options": "^3.0.4", + "nanoid": "^4.0.2", + "ora": "^6.3.1", + "p-wait-for": "5.0.2", + "path-browserify": "^1.0.1", + "playwright-core": "1.35.1", + "polka": "^0.5.2", + "premove": "^4.0.0", + "process": "^0.11.10", + "sade": "^1.8.1", + "sirv": "^2.0.3", + "source-map": "0.6.1", + "source-map-support": "^0.5.21", + "stream-browserify": "^3.0.0", + "strip-ansi": "^7.1.0", + "tempy": "^3.0.0", + "test-exclude": "^6.0.0", + "util": "^0.12.5", + "v8-to-istanbul": "^9.1.0" + }, + "bin": { + "playwright-test": "cli.js", + "pw-test": "cli.js" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/playwright-test/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/micromark": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.10.tgz", - "integrity": "sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==", + "node_modules/playwright-test/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "dev": true, "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" } }, - "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "node_modules/playwright-test/node_modules/playwright-core": { + "version": "1.35.1", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" } }, - "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/playwright-test/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/playwright-test/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "node_modules/polka": { + "version": "0.5.2", + "dev": true, + "license": "MIT", "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "@polka/url": "^0.5.0", + "trouter": "^2.0.1" } }, - "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "node_modules/postcss": { + "version": "8.4.28", + "dev": true, "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "dev": true, "funding": [ { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^1.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", - "dev": true, - "dependencies": { - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mjolnir.js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.1.tgz", - "integrity": "sha512-72BeUWgTv2cj5aZQKpwL8caNUFhXZ9bDm1hxpNj70XJQ62IBnTZmtv/WPxJvtaVNhzNo+D2U8O6ryNI0zImYcw==", - "dependencies": { - "@types/hammerjs": "^2.0.41", - "hammerjs": "^2.0.8" - }, - "engines": { - "node": ">= 4", - "npm": ">= 3" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mobx": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.6.1.tgz", - "integrity": "sha512-7su3UZv5JF+ohLr2opabjbUAERfXstMY+wiBtey8yNAPoB8H187RaQXuhFjNkH8aE4iHbDWnhDFZw0+5ic4nGQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - } - }, - "node_modules/mobx-react-lite": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.0.tgz", - "integrity": "sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mobx" - }, - "peerDependencies": { - "mobx": "^6.1.0", - "react": "^16.8.0 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/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==", - "dev": true - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/monaco-editor": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.35.0.tgz", - "integrity": "sha512-BJfkAZ0EJ7JgrgWzqjfBNP9hPSS8NlfECEDMEIIiozV2UaPq22yeuOjgbd3TwMh3anH0krWZirXZfn8KUSxiOA==" - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/multimatch/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^12.22 || ^14.13 || >=16" - } - }, - "node_modules/node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", - "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "node_modules/npm-package-arg/node_modules/hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/npm-packlist": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", - "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^1.1.2", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", - "dev": true, - "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-registry-fetch": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", - "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", - "dev": true, - "dependencies": { - "boolbase": "~1.0.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "node_modules/nx": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-14.5.4.tgz", - "integrity": "sha512-xv1nTaQP6kqVDE4PXcB1tLlgzNAPUHE/2vlqSLgxjNb6colKf0vrEZhVTjhnbqBeJiTb33gUx50bBXkurCkN5w==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@nrwl/cli": "14.5.4", - "@nrwl/tao": "14.5.4", - "@parcel/watcher": "2.0.4", - "chalk": "4.1.0", - "chokidar": "^3.5.1", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^10.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.0.0", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.3.4", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^3.9.0", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.4.0", - "yargs-parser": "21.0.1" - }, - "bin": { - "nx": "bin/nx.js" - }, - "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/nx/node_modules/chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/nx/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nx/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/nx/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nx/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nx/node_modules/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/nx/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/nx/node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/nx/node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/nx/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.4", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/orderedmap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.0.0.tgz", - "integrity": "sha512-buf4PoAMlh45b8a8gsGy/X6w279TSqkyAS0C0wdTSJwFSU+ljQFJON5I8NfjLHoCXwpSROIo2wr0g33T+kQshQ==" - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", - "dev": true, - "dependencies": { - "p-map": "^5.1.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-filter/node_modules/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "dependencies": { - "aggregate-error": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-pipe": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-retry/node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-wait-for": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", - "dev": true, - "dependencies": { - "p-timeout": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-wait-for/node_modules/p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-waterfall": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", - "dev": true, - "dependencies": { - "p-reduce": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pacote": { - "version": "13.6.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.1.tgz", - "integrity": "sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw==", - "dev": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/pacote/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/pacote/node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/pad-left": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", - "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==", - "dependencies": { - "repeat-string": "^1.5.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-conflict-json": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", - "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz", - "integrity": "sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==", - "dev": true, - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz", - "integrity": "sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==", - "dev": true, - "dependencies": { - "is-ssh": "^1.4.0", - "normalize-url": "^6.1.0", - "parse-path": "^5.0.0", - "protocols": "^2.0.1" - } - }, - "node_modules/parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dev": true, - "dependencies": { - "entities": "^4.3.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/patch-package": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", - "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", - "dev": true, - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/patch-package/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/patch-package/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/patch-package/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/patch-package/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/patch-package/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/penpal": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/penpal/-/penpal-6.2.2.tgz", - "integrity": "sha512-RQD7hTx14/LY7QoS3tQYO3/fzVtwvZI+JeS5udgsu7FPaEDjlvfK9HBcme9/ipzSPKnrxSgacI9PI7154W62YQ==" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/playwright": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.24.2.tgz", - "integrity": "sha512-iMWDLgaFRT+7dXsNeYwgl8nhLHsUrzFyaRVC+ftr++P1dVs70mPrFKBZrGp1fOKigHV9d1syC03IpPbqLKlPsg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "playwright-core": "1.24.2" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-core": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.24.2.tgz", - "integrity": "sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-test": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/playwright-test/-/playwright-test-8.1.1.tgz", - "integrity": "sha512-FFfuPH6Q/AFoJQDJ6/ateZBBQoiJx8LS8eM0pWExgB0OS9nygnM+KMR/25/dfYdlgw1bESlwtBa5UrBwulvKIw==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "camelcase": "^6.3.0", - "chokidar": "^3.5.3", - "cpy": "^9.0.1", - "esbuild": "0.14.39", - "events": "^3.3.0", - "globby": "^13.1.1", - "kleur": "^4.1.4", - "lilconfig": "^2.0.5", - "lodash": "^4.17.21", - "merge-options": "^3.0.4", - "nanoid": "^3.3.4", - "ora": "^6.1.0", - "p-wait-for": "4.1.0", - "path-browserify": "^1.0.1", - "playwright-core": "1.22.1", - "polka": "^0.5.2", - "premove": "^4.0.0", - "process": "^0.11.10", - "sade": "^1.8.1", - "sirv": "^2.0.2", - "source-map": "0.6.1", - "stream-browserify": "^3.0.0", - "strip-ansi": "^7.0.0", - "tape": "^5.5.3", - "tempy": "^3.0.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0" - }, - "bin": { - "playwright-test": "cli.js", - "pw-test": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/playwright-test/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/playwright-test/node_modules/bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/playwright-test/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/playwright-test/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/playwright-test/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/esbuild": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", - "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "esbuild-android-64": "0.14.39", - "esbuild-android-arm64": "0.14.39", - "esbuild-darwin-64": "0.14.39", - "esbuild-darwin-arm64": "0.14.39", - "esbuild-freebsd-64": "0.14.39", - "esbuild-freebsd-arm64": "0.14.39", - "esbuild-linux-32": "0.14.39", - "esbuild-linux-64": "0.14.39", - "esbuild-linux-arm": "0.14.39", - "esbuild-linux-arm64": "0.14.39", - "esbuild-linux-mips64le": "0.14.39", - "esbuild-linux-ppc64le": "0.14.39", - "esbuild-linux-riscv64": "0.14.39", - "esbuild-linux-s390x": "0.14.39", - "esbuild-netbsd-64": "0.14.39", - "esbuild-openbsd-64": "0.14.39", - "esbuild-sunos-64": "0.14.39", - "esbuild-windows-32": "0.14.39", - "esbuild-windows-64": "0.14.39", - "esbuild-windows-arm64": "0.14.39" - } - }, - "node_modules/playwright-test/node_modules/esbuild-android-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.39.tgz", - "integrity": "sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-android-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.39.tgz", - "integrity": "sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-darwin-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.39.tgz", - "integrity": "sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-darwin-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.39.tgz", - "integrity": "sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-freebsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.39.tgz", - "integrity": "sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-freebsd-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.39.tgz", - "integrity": "sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-32": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.39.tgz", - "integrity": "sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", - "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-arm": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.39.tgz", - "integrity": "sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.39.tgz", - "integrity": "sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-mips64le": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.39.tgz", - "integrity": "sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-ppc64le": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.39.tgz", - "integrity": "sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-riscv64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.39.tgz", - "integrity": "sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-linux-s390x": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.39.tgz", - "integrity": "sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-netbsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.39.tgz", - "integrity": "sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-openbsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.39.tgz", - "integrity": "sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-sunos-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.39.tgz", - "integrity": "sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-windows-32": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.39.tgz", - "integrity": "sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-windows-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.39.tgz", - "integrity": "sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/esbuild-windows-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.39.tgz", - "integrity": "sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/playwright-test/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/is-unicode-supported": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/playwright-test/node_modules/ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "dependencies": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/playwright-core": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.1.tgz", - "integrity": "sha512-H+ZUVYnceWNXrRf3oxTEKAr81QzFsCKu5Fp//fEjQvqgKkfA1iX3E9DBrPJpPNOrgVzcE+IqeI0fDmYJe6Ynnw==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/playwright-test/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/playwright-test/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/polka": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", - "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", - "dev": true, - "dependencies": { - "@polka/url": "^0.5.0", - "trouter": "^2.0.1" - } - }, - "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/premove": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/premove/-/premove-4.0.0.tgz", - "integrity": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==", - "dev": true, - "bin": { - "premove": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/probe.gl": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.5.2.tgz", - "integrity": "sha512-8lFQVmi7pMQZkqfj8+VjX4GU9HTkyxgRm5/h/xxA/4/IvZPv3qtP996L+awPwZsrPRKEw99t12SvqEHqSls/sA==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.5.2", - "@probe.gl/log": "3.5.2", - "@probe.gl/stats": "3.5.2" - } - }, - "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", - "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", - "dev": true, - "dependencies": { - "read": "1" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/prosemirror-commands": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.0.tgz", - "integrity": "sha512-BwBbZ5OAScPcm0x7H8SPbqjuEJnCU2RJT9LDyOiiIl/3NbL1nJZI4SFNHwU2e/tRr2Xe7JsptpzseqvZvToLBQ==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.5.0.tgz", - "integrity": "sha512-vy7i77ddKyXlu8kKBB3nlxLBnsWyKUmQIPB5x8RkYNh01QNp/qqGmdd5yZefJs0s3rtv5r7Izfu2qbtr+tYAMQ==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.0.tgz", - "integrity": "sha512-9Tdx83xB2W4Oqchm12FtCkSizbqvi64cjs1I9TRPblqdA5TUWoVZ4ZI+t71Jh6HSEh4cDMPzx3UwfryJtKlb/w==", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", - "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.1.tgz", - "integrity": "sha512-IxSVBKAEMjD7s3n8cgtwMlxAXZrC7Mlag7zYsAKDndAqnDScvSmp/UdnRTV/B33lTCVU3CCm7dyAn/rVVD0mcw==", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.0.tgz", - "integrity": "sha512-8PT/9xOx1HHdC7fDNNfhQ50Z8Mzu7nKyA1KCDltSpcZVZIbB0k7KtsHrnXyuIhbLlScoymBiLZ00c5MH6wdFsA==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.1.tgz", - "integrity": "sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.6.0.tgz", - "integrity": "sha512-MAp7AjsjEGEqQY0sSMufNIUuEyB1ZR9Fqlm8dTwwWwpEJRv/plsKjWXBbx52q3Ml8MtaMcd7ic14zAHVB3WaMw==", - "dependencies": { - "prosemirror-model": "^1.0.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.26.2.tgz", - "integrity": "sha512-CGKw+GadkfSBEwRAJTHCEKJ4DlV6/3IhAdjpwGyZHUHtbP7jX4Ol4zmi7xa2c6GOabDlIJLYXJydoNYLX7lNeQ==", - "dependencies": { - "prosemirror-model": "^1.16.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "node_modules/protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-avatar": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-3.10.0.tgz", - "integrity": "sha512-FB20OZIAJif0WNzGy4PwT5Nca4rekrYWiswBofuGAa5FKpRrFbJKY69267dRXbFqIYQrA/OxNB/TjhnmP2gsEQ==", - "dependencies": { - "core-js": "^3.6.1", - "is-retina": "^1.0.3", - "md5": "^2.0.0" - }, - "peerDependencies": { - "prop-types": "^15.0.0 || ^16.0.0", - "react": "^15.0.0 || ^16.0.0 || ^17.0.0" - } - }, - "node_modules/react-beautiful-dnd-next": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/react-beautiful-dnd-next/-/react-beautiful-dnd-next-11.0.5.tgz", - "integrity": "sha512-kM5Mob41HkA3ShS9uXqeMkW51L5bVsfttxfrwwHucu7I6SdnRKCyN78t6QiLH/UJQQ8T4ukI6NeQAQQpGwolkg==", - "dependencies": { - "@babel/runtime-corejs2": "^7.4.5", - "css-box-model": "^1.1.2", - "memoize-one": "^5.0.4", - "raf-schd": "^4.0.0", - "react-redux": "^7.0.3", - "redux": "^4.0.1", - "tiny-invariant": "^1.0.4", - "use-memo-one": "^1.1.0" - }, - "peerDependencies": { - "react": "^16.8.5" - } - }, - "node_modules/react-beautiful-dnd-next/node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/react-clientside-effect": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", - "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", - "dependencies": { - "@babel/runtime": "^7.12.13" - }, - "peerDependencies": { - "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-display-name": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz", - "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==" - }, - "node_modules/react-dnd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.7.0.tgz", - "integrity": "sha512-anpJDKMgdXE6kXvtBFmIAe1fuaexpVy7meUyNjiTfCnjQ1mRvnttGTVvcW9fMKijsUQYadiyvzd3BRxteFuVXg==", - "peer": true, - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "dnd-core": "^7.7.0", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.1.0", - "shallowequal": "^1.1.0" - }, - "peerDependencies": { - "react": ">= 16.8", - "react-dom": ">= 16.8" - } - }, - "node_modules/react-dnd-html5-backend": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-14.1.0.tgz", - "integrity": "sha512-6ONeqEC3XKVf4eVmMTe0oPds+c5B9Foyj8p/ZKLb7kL2qh9COYxiBHv3szd6gztqi/efkmriywLUVlPotqoJyw==", - "dependencies": { - "dnd-core": "14.0.1" - } - }, - "node_modules/react-dnd-html5-backend/node_modules/dnd-core": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.1.tgz", - "integrity": "sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==", - "dependencies": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.1.1" - } - }, - "node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "node_modules/react-focus-lock": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.1.tgz", - "integrity": "sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg==", - "dependencies": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^0.11.2", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.6", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-github-btn": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.3.0.tgz", - "integrity": "sha512-IpyNbbYENfmYOLoRkeKauAZF5PTkplawRquSiI7uDVJBUCVrR5jQ9zYBx4TlpzhWeYU+BIfKNnXtz2wvQJPsZg==", - "dependencies": { - "github-buttons": "^2.21.1" - } - }, - "node_modules/react-icons": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", - "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-input-autosize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", - "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", - "dependencies": { - "prop-types": "^15.5.8" - }, - "peerDependencies": { - "react": "^16.3.0 || ^17.0.0" - } - }, - "node_modules/react-inspector": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz", - "integrity": "sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg==", - "peerDependencies": { - "react": "^16.8.4 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-intl-next": { - "name": "react-intl", - "version": "5.25.1", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-5.25.1.tgz", - "integrity": "sha512-pkjdQDvpJROoXLMltkP/5mZb0/XqrqLoPGKUCfbdkP8m6U9xbK40K51Wu+a4aQqTEvEK5lHBk0fWzUV72SJ3Hg==", - "dependencies": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-messageformat-parser": "2.1.0", - "@formatjs/intl": "2.2.1", - "@formatjs/intl-displaynames": "5.4.3", - "@formatjs/intl-listformat": "6.5.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react": "16 || 17 || 18", - "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "9.13.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "react": "^16.3.0 || 17 || 18", - "typescript": "^4.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true - }, - "node_modules/react-loosely-lazy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-loosely-lazy/-/react-loosely-lazy-1.0.0.tgz", - "integrity": "sha512-Ai/ox310hio8D0FxiZPEORTnHgyTeQ3seNhxVb+jh1hBrEgBlvB4Pvvb5zAKiktwcYGNIHQaZqtATkS68WLw5Q==", - "peerDependencies": { - "@react-loosely-lazy/manifest": "1.0.0", - "react": "^16.9.0 || ^17.0.0-0" - } - }, - "node_modules/react-node-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-node-resolver/-/react-node-resolver-1.0.1.tgz", - "integrity": "sha512-IiSe0h2+IJo4enSlbdYjdwJnY86A7TwNxnfQVG2yApxVkHj9es1jum9Lb2aiBXKkLnwAj7ufBBlAa0ROU0o9nA==" - }, - "node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-redux": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", - "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-redux/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", - "dependencies": { - "history": "^5.2.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", - "dependencies": { - "history": "^5.2.0", - "react-router": "6.2.2" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-scrolllock": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scrolllock/-/react-scrolllock-5.0.1.tgz", - "integrity": "sha512-poeEsjnZAlpA6fJlaNo4rZtcip2j6l5mUGU/SJe1FFlicEudS943++u7ZSdA7lk10hoyYK3grOD02/qqt5Lxhw==", - "dependencies": { - "exenv": "^1.2.2" - }, - "peerDependencies": { - "react": "^16.3.0" - } - }, - "node_modules/react-select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", - "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.1.1", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-input-autosize": "^3.0.0", - "react-transition-group": "^4.3.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/react-select/node_modules/@emotion/cache": { - "version": "11.10.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", - "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", - "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.0.13" - } - }, - "node_modules/react-select/node_modules/@emotion/sheet": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz", - "integrity": "sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==" - }, - "node_modules/react-select/node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "node_modules/react-select/node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" - }, - "node_modules/react-select/node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/react-uid": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/react-uid/-/react-uid-2.3.2.tgz", - "integrity": "sha512-oeaoT4YOjsqHdrEJoO8SONNNBsoGh7AJPbsNqRK6Dv8UMdctWxA4ncj9gAA/Odki5g0GZaDSR7HydBJ8HxwgNg==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/read-cmd-shim": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz", - "integrity": "sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", - "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/read-package-json/node_modules/normalize-package-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", - "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/realistic-structured-clone": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/realistic-structured-clone/-/realistic-structured-clone-2.0.4.tgz", - "integrity": "sha512-lItAdBIFHUSe6fgztHPtmmWqKUgs+qhcYLi3wTRUl4OTB3Vb8aBVSjGfQZUvkmJCKoX3K9Wf7kyLp/F/208+7A==", - "dev": true, - "dependencies": { - "core-js": "^3.4", - "domexception": "^1.0.1", - "typeson": "^6.1.0", - "typeson-registry": "^1.0.0-alpha.20" - } - }, - "node_modules/realistic-structured-clone/node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "dependencies": { - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/realistic-structured-clone/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", - "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", - "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remixicon-react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remixicon-react/-/remixicon-react-1.0.0.tgz", - "integrity": "sha512-KOXlc8EdKdujr2f/2idyFSQRjUB8p0HNiWZYBBzRsTRlTXFuSAFfnGq9culNjhCGmc92Jbtfr9OP0MXWvTMdsQ==", - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dependencies": { - "is-core-module": "^2.9.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/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", - "dev": true, - "dependencies": { - "through": "~2.3.4" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", - "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", - "dev": true, - "peer": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - } - }, - "node_modules/rollup-plugin-inject/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", - "dev": true, - "dependencies": { - "rollup-plugin-inject": "^3.0.0" - } - }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.10.2.tgz", - "integrity": "sha512-5GMywXiLiuQP6ZzED/LO/Q0HyDi2W6b8VN+Zd3oB0opIjyRs494Me2ZMaqKWDNbGiW4jvvzl6L2n4zRgxS9cSQ==", - "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^4.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "dependencies": { - "estree-walker": "^0.6.1" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", - "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-peer": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", - "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "buffer": "^6.0.3", - "debug": "^4.3.2", - "err-code": "^3.0.1", - "get-browser-rtc": "^1.1.0", - "queue-microtask": "^1.2.3", - "randombytes": "^2.1.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/simple-peer/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/simple-peer/node_modules/err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - }, - "node_modules/sirv": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", - "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sirv/node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sort-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", - "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sort-keys/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, - "node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "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.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.replaceall": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.6.tgz", - "integrity": "sha512-OA8VDhE7ssNFlyoDXUHxw6V5cjgPrtosyJKqJX5i1P5tV9eUynsbhx1yz0g+Ye4fjFwAxhKLxt8GSRx2Aqc+Sw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", - "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz", - "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - }, - "bin": { - "sl-log-transformer": "bin/sl-log-transformer.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.2.6.tgz", - "integrity": "sha512-CpFUIyKXl5JP0PYQ7aNncpn6Oxts+5JfMvvdhjIN2S8afPZbw/VdgVucNkMrPrMY7aIFoYrm4qwti1V+vyhi2g==", - "hasInstallScript": true, - "dependencies": { - "buffer": "^5.0.3", - "css-to-react-native": "^2.0.3", - "fbjs": "^0.8.16", - "hoist-non-react-statics": "^2.5.0", - "is-plain-object": "^2.0.1", - "prop-types": "^15.5.4", - "react-is": "^16.3.1", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10", - "supports-color": "^3.2.3" - }, - "peerDependencies": { - "react": ">= 0.14.0 < 17.0.0-0" - } - }, - "node_modules/styled-components/node_modules/core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js." - }, - "node_modules/styled-components/node_modules/fbjs": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", - "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", - "dependencies": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styled-components/node_modules/hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "node_modules/styled-components/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/styled-components/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/styled-components/node_modules/stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "node_modules/styled-components/node_modules/stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "peerDependencies": { - "stylis": "^3.5.0" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "node_modules/svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/svgo/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/svgo/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/svgo/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/svgo/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/svgo/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/svgo/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/svgo/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true - }, - "node_modules/tabbable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.3.tgz", - "integrity": "sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg==" - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tape": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.0.tgz", - "integrity": "sha512-LyM4uqbiTAqDgsHTY0r1LH66yE24P3SZaz5TL3mPUds0XCTFl/0AMUBrjgBjUclvbPTFB4IalXg0wFfbTuuu/Q==", - "dev": true, - "dependencies": { - "array.prototype.every": "^1.1.3", - "call-bind": "^1.0.2", - "deep-equal": "^2.0.5", - "defined": "^1.0.0", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.2.3", - "has": "^1.0.3", - "has-dynamic-import": "^2.0.1", - "inherits": "^2.0.4", - "is-regex": "^1.1.4", - "minimist": "^1.2.6", - "object-inspect": "^1.12.2", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.3", - "resolve": "^2.0.0-next.3", - "resumer": "^0.0.0", - "string.prototype.trim": "^1.2.6", - "through": "^2.3.8" - }, - "bin": { - "tape": "bin/tape" - } - }, - "node_modules/tape/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/tape/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", - "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" - }, - "node_modules/tinybench": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", - "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", - "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", - "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/totalist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", - "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", - "dev": true, - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/treeverse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", - "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trouter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", - "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", - "dev": true, - "dependencies": { - "matchit": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", - "devOptional": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typeson": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/typeson/-/typeson-6.1.0.tgz", - "integrity": "sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==", - "dev": true, - "engines": { - "node": ">=0.1.14" - } - }, - "node_modules/typeson-registry": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/typeson-registry/-/typeson-registry-1.0.0-alpha.39.tgz", - "integrity": "sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==", - "dev": true, - "dependencies": { - "base64-arraybuffer-es6": "^0.7.0", - "typeson": "^6.0.0", - "whatwg-url": "^8.4.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "node_modules/uglify-js": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz", - "integrity": "sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unhomoglyph": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", - "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "dependencies": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-util-is": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", - "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", - "dependencies": { - "@types/unist": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", - "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", - "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "dev": true - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/vfile": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.4.tgz", - "integrity": "sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw==", - "dependencies": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", - "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile/node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/vite": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz", - "integrity": "sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==", - "dev": true, - "dependencies": { - "esbuild": "^0.14.47", - "postcss": "^8.4.16", - "resolve": "^1.22.1", - "rollup": ">=2.75.6 <2.77.0 || ~2.77.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "less": "*", - "sass": "*", - "stylus": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "less": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/vite/node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.4.tgz", - "integrity": "sha512-4ratHSyVEJPtBLV00uhL4Wj3Pmandc9rsxUkE0q9peNOfaOgGF4lEepdkaXGRi9AGFKr1GRVtjGOJ6Fp2lCpEg==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.3", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "chai": "^4.3.6", - "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "strip-literal": "^0.4.2", - "tinybench": "^2.3.1", - "tinypool": "^0.3.0", - "tinyspy": "^1.0.2", - "vite": "^3.0.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.16.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vscode-lib": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/vscode-lib/-/vscode-lib-0.1.2.tgz", - "integrity": "sha512-X7YTInfdx0D7O5d5jxv5tirYNlZT3wwmB/auEWDq8nKrJCkZea48y1brADKWSfmmSCvmaZwG5RJ3VOQf/pPwMg==" - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" - }, - "node_modules/w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", - "dev": true, - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/wasm-dce": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wasm-dce/-/wasm-dce-1.0.2.tgz", - "integrity": "sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==", - "dependencies": { - "@babel/core": "^7.0.0-beta.39", - "@babel/traverse": "^7.0.0-beta.39", - "@babel/types": "^7.0.0-beta.39", - "babylon": "^7.0.0-beta.39", - "webassembly-interpreter": "0.0.30" - } - }, - "node_modules/wasm-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wasm-loader/-/wasm-loader-1.3.0.tgz", - "integrity": "sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==", - "dependencies": { - "loader-utils": "^1.1.0", - "wasm-dce": "^1.0.0" - }, - "peerDependencies": { - "wasm-dce": "1.x" - } - }, - "node_modules/wasm-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" - }, - "node_modules/webassembly-floating-point-hex-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/webassembly-floating-point-hex-parser/-/webassembly-floating-point-hex-parser-0.1.2.tgz", - "integrity": "sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==", - "engines": { - "node": "*" - } - }, - "node_modules/webassembly-interpreter": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/webassembly-interpreter/-/webassembly-interpreter-0.0.30.tgz", - "integrity": "sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==", - "dependencies": { - "@babel/code-frame": "^7.0.0-beta.36", - "long": "^3.2.0", - "webassembly-floating-point-hex-parser": "0.1.2" - }, - "bin": { - "wasm": "lib/bin/repl.js", - "wasm2wast": "lib/bin/wasm2wast.js", - "wasmast": "lib/bin/wasmast.js", - "wasmdump": "lib/bin/wasmdump.js", - "wasmrun": "lib/bin/wasmrun.js", - "wastast": "lib/bin/wastast.js" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true, - "engines": { - "node": ">=10.4" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dev": true, - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" - } - }, - "node_modules/write-json-file": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz", - "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==", - "dev": true, - "dependencies": { - "detect-indent": "^6.0.0", - "graceful-fs": "^4.1.15", - "is-plain-obj": "^2.0.0", - "make-dir": "^3.0.0", - "sort-keys": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8.3" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/write-json-file/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/write-json-file/node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", - "dev": true, - "dependencies": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/write-pkg/node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-pkg/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/write-pkg/node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/write-pkg/node_modules/type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/write-pkg/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/write-pkg/node_modules/write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "dependencies": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y-indexeddb": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.6.tgz", - "integrity": "sha512-8mdCYdzZDWS2lGiB9Reaz67ZqvnV6EXH/F7L+TmBC+3mWjIBrPw4UcI79nOhEOh+y9lHXzNpSda4YJ06M13F1A==", - "dependencies": { - "lib0": "^0.2.35" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, - "peerDependencies": { - "yjs": "^13.0.0" - } - }, - "node_modules/y-monaco": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/y-monaco/-/y-monaco-0.1.4.tgz", - "integrity": "sha512-RzAvjKJ2yt3VjlKK55U8STJyd1gz5/Qm6pjt7SAVb+k+g+KaSeTuSBGt+lURN+dzzSNs73ZkIAerW3JM0mzBSw==", - "dependencies": { - "lib0": "^0.2.43" - }, - "peerDependencies": { - "monaco-editor": ">=0.20.0", - "yjs": "^13.3.1" - } - }, - "node_modules/y-prosemirror": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.0.20.tgz", - "integrity": "sha512-LVMtu3qWo0emeYiP+0jgNcvZkqhzE/otOoro+87q0iVKxy/sMKuiJZnokfJdR4cn9qKx0Un5fIxXqbAlR2bFkA==", - "dependencies": { - "lib0": "^0.2.42" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, - "peerDependencies": { - "prosemirror-model": "^1.7.1", - "prosemirror-state": "^1.2.3", - "prosemirror-view": "^1.9.10", - "y-protocols": "^1.0.1", - "yjs": "^13.3.2" - } - }, - "node_modules/y-protocols": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.5.tgz", - "integrity": "sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==", - "dependencies": { - "lib0": "^0.2.42" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/y-webrtc": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.3.tgz", - "integrity": "sha512-X7a6c56/jWhEI8LHLmT3LgzwbPA4r8h46pdVvV+55EQJhi+K6RfmisWgj7h6/2gkB0yveq7iDxlmyrYGnAKW/Q==", - "dependencies": { - "lib0": "^0.2.42", - "simple-peer": "^9.11.0", - "y-protocols": "^1.0.5" - }, - "bin": { - "y-webrtc-signaling": "bin/server.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - }, - "optionalDependencies": { - "ws": "^7.2.0" - } - }, - "node_modules/y-webrtc/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yjs": { - "version": "13.5.41", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.41.tgz", - "integrity": "sha512-4eSTrrs8OeI0heXKKioRY4ag7V5Bk85Z4MeniUyown3o3y0G7G4JpAZWrZWfTp7pzw2b53GkAQWKqHsHi9j9JA==", - "dependencies": { - "lib0": "^0.2.49" - }, - "funding": { - "type": "GitHub Sponsors ❤", - "url": "https://github.com/sponsors/dmonad" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", - "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/zxcvbn": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz", - "integrity": "sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==" - }, - "packages/common": { - "name": "@typecell-org/common", - "version": "0.0.3", - "dependencies": { - "buffer": "^6.0.3", - "string.prototype.replaceall": "^1.0.5", - "uuid": "^8.3.2" - }, - "devDependencies": { - "@types/uuid": "^8.3.4", - "rimraf": "^3.0.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "typescript": "4.5.5" - } - }, - "packages/common/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "packages/common/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/editor": { - "name": "@typecell-org/editor", - "version": "0.0.3", - "dependencies": { - "@atlaskit/atlassian-navigation": "^2.2.6", - "@atlaskit/avatar": "^21.1.1", - "@atlaskit/banner": "^11.6.1", - "@atlaskit/breadcrumbs": "^11.7.3", - "@atlaskit/button": "^16.3.5", - "@atlaskit/checkbox": "^12.3.18", - "@atlaskit/comment": "^10.5.2", - "@atlaskit/css-reset": "^6.3.13", - "@atlaskit/dropdown-menu": "^11.3.0", - "@atlaskit/flag": "^14.6.3", - "@atlaskit/form": "^8.5.6", - "@atlaskit/inline-message": "^11.3.0", - "@atlaskit/menu": "^1.3.8", - "@atlaskit/modal-dialog": "^12.2.14", - "@atlaskit/page-header": "^10.2.3", - "@atlaskit/page-layout": "^1.2.7", - "@atlaskit/progress-bar": "^0.5.8", - "@atlaskit/section-message": "^6.1.14", - "@atlaskit/select": "^15.7.5", - "@atlaskit/spinner": "^15.1.14", - "@atlaskit/textarea": "^4.3.8", - "@atlaskit/textfield": "^5.1.12", - "@atlaskit/tree": "^8.6.1", - "@atlaskit/user-picker": "^9.3.1", - "@blocknote/core": "^0.1.0", - "@deck.gl/aggregation-layers": "^8.6.4", - "@deck.gl/core": "^8.6.4", - "@deck.gl/layers": "^8.6.4", - "@deck.gl/react": "^8.6.4", - "@emotion/react": "^11.4.0", - "@loaders.gl/core": "^3.0.12", - "@loaders.gl/images": "^3.0.12", - "@matrix-org/olm": "3.2.12", - "@syncedstore/yjs-reactive-bindings": "^0.4.0", - "@tippyjs/react": "^4.2.5", - "@tiptap/extension-collaboration": "^2.0.0-beta.38", - "@tiptap/extension-collaboration-cursor": "^2.0.0-beta.37", - "@typecell-org/common": "^0.0.3", - "@typecell-org/engine": "^0.0.3", - "@typecell-org/parsers": "^0.0.3", - "@typescript/vfs": "^1.3.4", - "classnames": "^2.3.1", - "events": "^3.3.0", - "filebridge-client": "^0.1.5", - "fractional-indexing": "^2.0.0", - "frontend-collective-react-dnd-scrollzone": "1.0.2", - "lodash": "^4.17.21", - "lowlight": "^1.20.0", - "lz-string": "^1.4.4", - "markdown-it": "^12.0.2", - "matrix-crdt": "^0.2.0", - "matrix-js-sdk": "^19.4.0", - "mobx": "^6.2.0", - "mobx-react-lite": "^3.2.0", - "monaco-editor": "^0.35.0", - "penpal": "^6.1.0", - "prettier": "2.4.1", - "probe.gl": "^3.1.4", - "qs": "^6.10.1", - "react": "^18.2.0", - "react-avatar": "^3.10.0", - "react-dnd": "^14.0.2", - "react-dnd-html5-backend": "^14.0.0", - "react-dom": "^18.2.0", - "react-error-overlay": "^6.0.9", - "react-github-btn": "^1.2.1", - "react-icons": "^4.6.0", - "react-inspector": "^6.0.1", - "react-intl-next": "npm:react-intl@^5.18.1", - "react-router-dom": "6.2.2", - "remixicon-react": "^1.0.0", - "semver": "^7.3.5", - "simple-peer": "^9.11.1", - "speakingurl": "^14.0.1", - "string.prototype.replaceall": "^1.0.5", - "styled-components": "3.2.6", - "tippy.js": "^6.3.1", - "typescript": "4.5.5", - "ua-parser-js": "^0.7.28", - "uuid": "^8.3.2", - "vscode-lib": "^0.1.2", - "wasm-loader": "^1.3.0", - "web-vitals": "^1.0.1", - "y-indexeddb": "9.0.6", - "y-monaco": "^0.1.3", - "y-protocols": "^1.0.5", - "y-webrtc": "^10.1.8", - "yjs": "^13.5.41", - "zxcvbn": "^4.4.2" - }, - "devDependencies": { - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "@playwright/test": "^1.18.1", - "@svgr/webpack": "^5.5.0", - "@types/lodash": "^4.14.168", - "@types/lowlight": "0.0.2", - "@types/markdown-it": "^10.0.3", - "@types/node": "^16.0.0", - "@types/prettier": "^2.6.4", - "@types/qs": "^6.9.7", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "@types/semver": "^7.3.8", - "@types/speakingurl": "^13.0.2", - "@types/ua-parser-js": "^0.7.36", - "@types/uuid": "^8.3.0", - "@types/zxcvbn": "^4.4.1", - "@vitejs/plugin-react": "^2.0.0", - "connect-history-api-fallback": "^2.0.0", - "cross-env": "^7.0.3", - "eslint": "^8.21.0", - "eslint-config-react-app": "^7.0.1", - "fake-indexeddb": "^3.1.2", - "glob": "^7.2.0", - "jsdom": "^20.0.0", - "rimraf": "^3.0.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-polyfill-node": "^0.10.2", - "vite": "^3.0.0", - "vitest": "^0.24.4" - } - }, - "packages/editor/node_modules/dnd-core": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.1.tgz", - "integrity": "sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==", - "dependencies": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.1.1" - } - }, - "packages/editor/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "packages/editor/node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/editor/node_modules/react-dnd": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-14.0.5.tgz", - "integrity": "sha512-9i1jSgbyVw0ELlEVt/NkCUkxy1hmhJOkePoCH713u75vzHGyXhPDm28oLfc2NMSBjZRM1Y+wRjHXJT3sPrTy+A==", - "dependencies": { - "@react-dnd/invariant": "^2.0.0", - "@react-dnd/shallowequal": "^2.0.0", - "dnd-core": "14.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - }, - "peerDependencies": { - "@types/hoist-non-react-statics": ">= 3.3.1", - "@types/node": ">= 12", - "@types/react": ">= 16", - "react": ">= 16.14" - }, - "peerDependenciesMeta": { - "@types/hoist-non-react-statics": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "packages/editor/node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "packages/editor/node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "packages/editor/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/engine": { - "name": "@typecell-org/engine", - "version": "0.0.3", - "dependencies": { - "es-module-shims": "1.4.3", - "lodash": "^4.17.21", - "mobx": "^6.2.0", - "react": "^18.2.0", - "vscode-lib": "^0.1.2" - }, - "devDependencies": { - "@playwright/test": "^1.18.1", - "@types/chai": "^4.3.0", - "@types/lodash": "^4.14.182", - "@types/mocha": "^9.1.0", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "chai": "^4.3.6", - "jsdom": "^20.0.0", - "mocha": "^9.2.1", - "playwright-test": "^8.1.1", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "vitest": "^0.24.4" - } - }, - "packages/engine/node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/engine/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/exporter": { - "name": "@typecell-org/exporter", - "version": "0.0.3", - "extraneous": true, - "dependencies": { - "@typecell-org/common": "*", - "es-module-shims": "1.4.3", - "fs-extra": "^10.1.0", - "lodash": "^4.17.21", - "mobx": "^6.2.0", - "react": "^17.0.2", - "remark-parse": "^10.0.1", - "remark-stringify": "^10.0.2", - "unified": "^10.0.1", - "vscode-lib": "^0.1.2" - }, - "devDependencies": { - "@playwright/test": "^1.18.1", - "@types/chai": "^4.3.0", - "@types/fs-extra": "9.0.13", - "@types/lodash": "^4.14.182", - "@types/mocha": "^9.1.0", - "@types/react": "^17.0.0", - "@vitest/coverage-c8": "^0.24.4", - "chai": "^4.3.6", - "fast-glob": "^3.2.12", - "jsdom": "^20.0.0", - "mocha": "^9.2.1", - "playwright-test": "^8.1.1", - "rimraf": "^3.0.2", - "typescript": "4.3.2", - "vitest": "^0.24.4" - } - }, - "packages/packager": { - "name": "@typecell-org/packager", - "version": "0.0.3", - "dependencies": { - "@typecell-org/common": "*", - "@typecell-org/engine": "*", - "@typecell-org/parsers": "*", - "es-module-shims": "1.4.3", - "fast-glob": "^3.2.12", - "lodash": "^4.17.21", - "mobx": "^6.2.0", - "react": "^18.2.0", - "vscode-lib": "^0.1.2" - }, - "devDependencies": { - "@playwright/test": "^1.18.1", - "@types/chai": "^4.3.0", - "@types/fs-extra": "9.0.13", - "@types/lodash": "^4.14.182", - "@types/mocha": "^9.1.0", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "chai": "^4.3.6", - "jsdom": "^20.0.0", - "mocha": "^9.2.1", - "playwright-test": "^8.1.1", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "vitest": "^0.24.4" - } - }, - "packages/packager/node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "packages/packager/node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/packager/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "packages/parsers": { - "name": "@typecell-org/parsers", - "version": "0.0.3", - "dependencies": { - "@typecell-org/common": "*", - "@typecell-org/engine": "*", - "fs-extra": "^10.1.0", - "remark-parse": "^10.0.1", - "remark-stringify": "^10.0.2", - "unified": "^10.0.1", - "vscode-lib": "^0.1.2" - }, - "devDependencies": { - "@playwright/test": "^1.18.1", - "@types/fs-extra": "9.0.13", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "fast-glob": "^3.2.12", - "jsdom": "^20.0.0", - "playwright-test": "^8.1.1", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "vitest": "^0.24.4" - } - }, - "packages/parsers/node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "packages/parsers/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/parsers/node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@arr/every": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@arr/every/-/every-1.0.1.tgz", - "integrity": "sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==", - "dev": true - }, - "@atlaskit/analytics-namespaced-context": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-namespaced-context/-/analytics-namespaced-context-6.5.1.tgz", - "integrity": "sha512-TZbjsoLBoZiQepvmvfSH5DK1bpSbGM4Syb1Nvh54CTSS/g2in3WNp2/oXn2CrED1PRRdWOEyKLEjTBAfrXDfqA==", - "requires": { - "@atlaskit/analytics-next": "^8.0.0", - "@babel/runtime": "^7.0.0" - } - }, - "@atlaskit/analytics-next": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next/-/analytics-next-8.3.2.tgz", - "integrity": "sha512-5IW4O1NFRLdO9y8VwlmVECVQeTcZ+WNZv7g1fci61ygNtrABCaaKDfCdvCYKdwSP1dbvlQw865q6vQIx/DV5+A==", - "requires": { - "@atlaskit/analytics-next-stable-react-context": "1.0.1", - "@babel/runtime": "^7.0.0", - "prop-types": "^15.5.10", - "use-memo-one": "^1.1.1" - } - }, - "@atlaskit/analytics-next-stable-react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@atlaskit/analytics-next-stable-react-context/-/analytics-next-stable-react-context-1.0.1.tgz", - "integrity": "sha512-iO6+hIp09dF4iAZQarVz3vKY1kM5Ij5CExYcK9jgc2q+OH8nv8n+BPFeJTdzGOGopmbUZn5Opj9pYQvge1Gr4Q==", - "requires": { - "tslib": "^2.0.0" - } - }, - "@atlaskit/atlassian-navigation": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/@atlaskit/atlassian-navigation/-/atlassian-navigation-2.2.8.tgz", - "integrity": "sha512-LedkHlFCmdwXG8V+5VGajoStxSYUaYrsmwEIEpjHiNKFeI8GwPhPiEknwwE04xzyj9XtFhM8neVocxXxtP0nmQ==", - "requires": { - "@atlaskit/analytics-namespaced-context": "^6.5.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/logo": "*", - "@atlaskit/popup": "^1.4.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.5.0", - "@atlaskit/width-detector": "^4.0.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "chromatism": "^2.6.0", - "lodash": "^4.17.21" - } - }, - "@atlaskit/avatar": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/@atlaskit/avatar/-/avatar-21.1.1.tgz", - "integrity": "sha512-mJeKN1QP0o6g76MydxSkF0VJNgS6UCECzuYWuqsWyy3EEghq6e3ToHWHVTGlFCmaF0cFTzvSUgUKE/1LT6B5rA==", - "requires": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/icon": "^21.11.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "@emotion/serialize": "^1.1.0" - }, - "dependencies": { - "@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", - "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" - } - } - }, - "@atlaskit/banner": { - "version": "11.6.2", - "resolved": "https://registry.npmjs.org/@atlaskit/banner/-/banner-11.6.2.tgz", - "integrity": "sha512-ymgNPKOyycNeccwD21GVk0HPVgWooINIbatZTDtTGLoCIp0Wg5tVnDqTAIDdWAnSP5avgAYe1ya2KR3fO5Z1gg==", - "requires": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/blanket": { - "version": "12.2.15", - "resolved": "https://registry.npmjs.org/@atlaskit/blanket/-/blanket-12.2.15.tgz", - "integrity": "sha512-iI36fkGuSb0ufgdOjmylvT1sSZlyuEU616EQb8q/SUP428tHqMFfkR6yGQZE4LYh2dFuCBU1rLpsVeyLLBd3nw==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/breadcrumbs": { - "version": "11.7.3", - "resolved": "https://registry.npmjs.org/@atlaskit/breadcrumbs/-/breadcrumbs-11.7.3.tgz", - "integrity": "sha512-q/PaUKGGaFnReFqc4s5+kBE4goUyat+VSMgs/jQ+lOe7+n9Xpz8o12F5RMK6tnh1Zo3LATAxuFbY9D1aAMrVsg==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.6.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "@react-loosely-lazy/manifest": "^1.0.0", - "react-loosely-lazy": "^1.0.0" - } - }, - "@atlaskit/button": { - "version": "16.3.6", - "resolved": "https://registry.npmjs.org/@atlaskit/button/-/button-16.3.6.tgz", - "integrity": "sha512-sigJimyIvWjRzBdW46oPoyyxDmIWaPi7YtxmWwshld0lxQ9U/HevAA4Jxo7tOoHkaQot4V+yLkVHTuTgaH4OJQ==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/spinner": "^15.1.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/checkbox": { - "version": "12.3.19", - "resolved": "https://registry.npmjs.org/@atlaskit/checkbox/-/checkbox-12.3.19.tgz", - "integrity": "sha512-RJ+aLBkLFeWp/0vcKfdVflsl+pJRwHxvWOJYKDkXHOpuVles6JUlWJE/9GsKYESgEqJ47v+2Dhq5g/plVdt3mQ==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/codemod-utils": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@atlaskit/codemod-utils/-/codemod-utils-4.1.2.tgz", - "integrity": "sha512-L2he0gAJiELTrrN0MP/9qUQtwG/u8p0XJEiUYITmE/Y9U9B1CfSYes1kDWeKDZlV9sN+QB8yP9BeTdIfTYWUbg==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "@atlaskit/comment": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/@atlaskit/comment/-/comment-10.6.0.tgz", - "integrity": "sha512-08TxoxK+SvoMyzd4UvrWvu6LDIzQokLdcYSejOTRuLtXrwOdASfkT0pdwz406vQj5QeNVOLGi8J2PJLmwx9+1Q==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/lozenge": "^11.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/css-reset": { - "version": "6.3.14", - "resolved": "https://registry.npmjs.org/@atlaskit/css-reset/-/css-reset-6.3.14.tgz", - "integrity": "sha512-KJbBK7bf4jY7Y/x838adkAxkJBFGIAV+vktfkwyci+I+KINoag/MgIML+veD5/sTVfoQuZxoj2mkGjmG7HDtmg==", - "requires": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "fbjs": "^3.0.0" - } - }, - "@atlaskit/dropdown-menu": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/dropdown-menu/-/dropdown-menu-11.4.0.tgz", - "integrity": "sha512-gOeV9H8qhr4R51UT8lvcCdAx+iN4VTB+K5HYmZbG3I9vHt83UMD0SFgmRHVH3pr9V0AxpdmHQn63hmuDjODmZw==", - "requires": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/menu": "^1.3.0", - "@atlaskit/popup": "^1.4.0", - "@atlaskit/spinner": "^15.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "bind-event-listener": "^2.1.1" - } - }, - "@atlaskit/ds-explorations": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@atlaskit/ds-explorations/-/ds-explorations-0.1.2.tgz", - "integrity": "sha512-YE74r/k+ow6GgZm/SxpZl86YeuJx6ZlmI8di5LhSt+KJ5rxxIHCoMt6yvzXmOUy3s4etgppuffUCcXonG58GVA==", - "requires": { - "@atlaskit/tokens": "^0.10.3", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "tiny-invariant": "^1.2.0" - } - }, - "@atlaskit/ds-lib": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@atlaskit/ds-lib/-/ds-lib-2.1.1.tgz", - "integrity": "sha512-QwaDma9UMUTPaApkjlzt07gmzoEZKegjixlDHEY7DOCzWqGbt1efxuoiP3GLP1Z5eFf5tHWPtlUYMlb+PO37GQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "bind-event-listener": "^2.1.1" - } - }, - "@atlaskit/flag": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/@atlaskit/flag/-/flag-14.7.0.tgz", - "integrity": "sha512-kIzpihZimEWQxF9rbE44DvGNu9hNjFT+Tr5EYxoDrSIyDY9kRHo3xLK9DPqn0NrwrxJ2e5bV9rM8cQGTUnYyHA==", - "requires": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/button": "^16.3.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/portal": "^4.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/focus-ring": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@atlaskit/focus-ring/-/focus-ring-1.0.6.tgz", - "integrity": "sha512-aqTrhYnJDWjrwJrq4vakip9vreZmQKMP/2mP9glQoXIQMCsmOK6hn8G865q+7wfq1TjlbSZwBS7kxX+op+ymWw==", - "requires": { - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/form": { - "version": "8.5.8", - "resolved": "https://registry.npmjs.org/@atlaskit/form/-/form-8.5.8.tgz", - "integrity": "sha512-IdM+dI9U6YAQxV7tswE8/p7QIdTiW6xb1kJn5C6x/Ux1xAG480vsNQyOJPzQEAdOTssIGbvl7fDbnECEbpXWNg==", - "requires": { - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "final-form": "^4.20.1", - "final-form-focus": "^1.1.2", - "lodash": "^4.17.21", - "react-uid": "^2.2.0", - "tiny-invariant": "^1.2.0" - } - }, - "@atlaskit/icon": { - "version": "21.11.1", - "resolved": "https://registry.npmjs.org/@atlaskit/icon/-/icon-21.11.1.tgz", - "integrity": "sha512-KAcEmf7M04AFeHpzOA+JiHZ6bAXz7h6vNlMd543VZM15fyjMMiP/p3DItnmEwK1mej0zBRT98nnhiDKxaHtJug==", - "requires": { - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/inline-dialog": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/inline-dialog/-/inline-dialog-13.4.0.tgz", - "integrity": "sha512-G7U8Yi3Ypx1eXKXHD5atv9bnM3s+Z6uVqFNGWuMizJnLJhspMQRhjqUb1JMs9OlrJ9VyDU2salQWPOSka1vAhQ==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "bind-event-listener": "^2.1.1", - "react-node-resolver": "^1.0.1" - } - }, - "@atlaskit/inline-message": { - "version": "11.4.0", - "resolved": "https://registry.npmjs.org/@atlaskit/inline-message/-/inline-message-11.4.0.tgz", - "integrity": "sha512-ziGHgQRnvKWh67NqxH4zPoKWuBEYYw1/+wUeYkh3b+XesYmVhnKm6h6pGndtjmgfTofyImiUyuv8kGkbWNE29w==", - "requires": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/inline-dialog": "^13.4.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/logo": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/@atlaskit/logo/-/logo-13.9.0.tgz", - "integrity": "sha512-l/UGg4JrCMxp9f3GC5scvqhWwh8iZIgiIWFXsfP9oWqA0tB9yNGrxag6hM6QXpWPhXiN4sUPwse8pgxOOnLs2Q==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "react-uid": "^2.2.0" - } - }, - "@atlaskit/lozenge": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/lozenge/-/lozenge-11.2.0.tgz", - "integrity": "sha512-0YCDa6BEnNbT12TXcsmASwUtxgotvk29xwhPkAhwukSk6Zm9lA/t1CFtTWwBoO65r3gw0neFfoE+3Xe6pGgIkQ==", - "requires": { - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-explorations": "^0.1.0", - "@atlaskit/theme": "^12.2.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/menu": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@atlaskit/menu/-/menu-1.3.9.tgz", - "integrity": "sha512-XWuAMUyRqgoUNLkkpyif/d4qOCQzzbusT7KRC96YvpqS5Vbogbi8m93ZyXccSkjat8ByVlY8p1sgHWSzGko1Dw==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/modal-dialog": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/modal-dialog/-/modal-dialog-12.3.0.tgz", - "integrity": "sha512-HvmPjaNpu5/SYCfYgqyjFKzXdgoT7jMl6JrESgeYNPQdse8Pzj+Q1CbFynCMJ5+jMg80AMNwrhWYKY/dtKy5tA==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/blanket": "^12.2.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/focus-ring": "^1.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/portal": "^4.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "bind-event-listener": "^2.1.1", - "raf-schd": "^4.0.3", - "react-focus-lock": "^2.5.2", - "react-scrolllock": "^5.0.1", - "react-uid": "^2.2.0" - } - }, - "@atlaskit/motion": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@atlaskit/motion/-/motion-1.2.2.tgz", - "integrity": "sha512-UIoFuB299bTehwTkoBs65YS8kn9y32v1b5LsbuSqkWV2ZgiLrWaOdq8RgPBlHuICq9oBeVy6aBPLR0gkht1iJA==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "bind-event-listener": "^2.1.1" - } - }, - "@atlaskit/page-header": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/page-header/-/page-header-10.3.0.tgz", - "integrity": "sha512-PAsBEaIamSinpG7J0c9CBDcwcRexSe37yv4samznI2Oupyu7JzeGsoh2FHvUTkscv75Imh1RVvCpoA92OjIPsg==", - "requires": { - "@atlaskit/theme": "^12.2.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/page-layout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@atlaskit/page-layout/-/page-layout-1.3.0.tgz", - "integrity": "sha512-N9VJyHGoK8nBOCXzXGF/kAp9geumcdShXeExk/0pE2b4LcMzapHCTA7POuj0gAPffswOYcx0FDcr2jc5KnjAoQ==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "bind-event-listener": "^2.1.1", - "raf-schd": "^4.0.3" - } - }, - "@atlaskit/popper": { - "version": "5.2.8", - "resolved": "https://registry.npmjs.org/@atlaskit/popper/-/popper-5.2.8.tgz", - "integrity": "sha512-uQzw8EWWXBhL1N3Dak4ZrkE1hVcqi82bL5COLbS5oYHPcIInJiBZhygAstboVB+BfaKlWtyCdujkBprGU+V5Dw==", - "requires": { - "@babel/runtime": "^7.0.0", - "@popperjs/core": "^2.9.1", - "react-popper": "^2.2.3" - } - }, - "@atlaskit/popup": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@atlaskit/popup/-/popup-1.4.1.tgz", - "integrity": "sha512-+hPmkoOUIdrU9WamWECq+qlGTdfQQlkGB569FnAFO5gDNgEZo6ZCUgMqRH8jgUa3OSp2aohprZeeYDd6B9rxWA==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/portal": "^4.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "bind-event-listener": "^2.1.1", - "focus-trap": "^2.4.5" - } - }, - "@atlaskit/portal": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/@atlaskit/portal/-/portal-4.2.10.tgz", - "integrity": "sha512-MmGS1NPiNyCinvmic1UKn2GQl8I9jLjfEz8AUVFimP4ytHFQDBE2sQG7eYN7arQDlhXmZAu2xIFt1A1OyD9OnA==", - "requires": { - "@atlaskit/theme": "^12.1.0", - "@babel/runtime": "^7.0.0" - } - }, - "@atlaskit/progress-bar": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@atlaskit/progress-bar/-/progress-bar-0.5.10.tgz", - "integrity": "sha512-dvCf583efRj7830PKW+wfjUYVMKqvKkaNhC3mJnk1RxfIEETwWUmSaOK9FE3h6vgeb7PBSTo/DlfdPyWRkHrkg==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/section-message": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/section-message/-/section-message-6.2.0.tgz", - "integrity": "sha512-hJFYr/LXsTDpuXEXGjwr8pP0meMfYPz+ANQ4kssVSC/ydAAbaMnpd0NrjHO7fcMtfVNqlXfdeqf7l2WsE7DZJA==", - "requires": { - "@atlaskit/button": "^16.3.0", - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/select": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@atlaskit/select/-/select-15.7.5.tgz", - "integrity": "sha512-UnFVrJvM3FKAbXf8CqNE0y40X1F4l9Ax2Lupbvj2fnj9gOSFLR+zrI4/c/IDiOyE9CusIjqpkXFl4ft86fn9kQ==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/icon": "^21.11.0", - "@atlaskit/spinner": "^15.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/visually-hidden": "^1.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "@popperjs/core": "^2.9.1", - "@types/react-select": "^4.0.18", - "bind-event-listener": "^2.1.1", - "memoize-one": "^6.0.0", - "react-fast-compare": "^3.2.0", - "react-focus-lock": "^2.5.2", - "react-node-resolver": "^1.0.1", - "react-popper": "^2.2.3", - "react-select": "^4.3.1", - "react-uid": "^2.2.0", - "shallow-equal": "^1.0.0" - } - }, - "@atlaskit/spinner": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/spinner/-/spinner-15.2.0.tgz", - "integrity": "sha512-0Fwi7D3TgdYoE6rwG2obESUZyQWTGoCx32CAmWGlcOad5dz9RqKBy8kRrnenqOHpATULuPfvD40r0/qe2IGTmQ==", - "requires": { - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/textarea": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@atlaskit/textarea/-/textarea-4.3.9.tgz", - "integrity": "sha512-5fyeYhFoaeXCYp448LckY63OHA1NhfhVE/u4PmvonLDug0cfVkCNnqBqqReT8CzCJe4Q+z8+OnPXkG/zKHow0A==", - "requires": { - "@atlaskit/analytics-next": "^8.0.0", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9" - } - }, - "@atlaskit/textfield": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/textfield/-/textfield-5.2.0.tgz", - "integrity": "sha512-Gf3ABEzsWq9Sw3ySd/67vCidhmU1K/pqudwj7zXP1VBeSxn+mw51YHrUD7TE2VqLUEyFvOmBUQtNmeQDl581KA==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/theme": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@atlaskit/theme/-/theme-12.2.0.tgz", - "integrity": "sha512-fgCWBgmkx7wr/eIui3kOkLiOrhZYt8ON2E5HJMWWohu6I3vYsQUNCbWjp1Uoht0NLgb0FvwYfPeEmsZUJsX9Cg==", - "requires": { - "@atlaskit/codemod-utils": "^4.1.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0" - } - }, - "@atlaskit/tokens": { - "version": "0.10.18", - "resolved": "https://registry.npmjs.org/@atlaskit/tokens/-/tokens-0.10.18.tgz", - "integrity": "sha512-WoN0NKaYdx7qnRu8CRzFEHwp9tocsED0YHH0ImO+MmjvwS+lNtfcz7sHbuENOehtCBSCcwohNAWDA4MplvX1wg==", - "requires": { - "@atlaskit/ds-lib": "^2.1.0", - "@babel/runtime": "^7.0.0", - "@babel/traverse": "^7.15.0", - "@babel/types": "^7.15.0" - } - }, - "@atlaskit/tooltip": { - "version": "17.6.1", - "resolved": "https://registry.npmjs.org/@atlaskit/tooltip/-/tooltip-17.6.1.tgz", - "integrity": "sha512-zI660ZyG/go/M7XEYk7vh562gSX0/u0fCMnM5sln0r/gEk5pAhTDQh+X0oxhF78+S5vw9kUju8eHcpBJwfQ1Kw==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/ds-lib": "^2.1.0", - "@atlaskit/motion": "^1.2.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/portal": "^4.1.0", - "@atlaskit/theme": "^12.2.0", - "@atlaskit/tokens": "^0.10.0", - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1", - "bind-event-listener": "^2.1.1", - "react-uid": "^2.2.0" - } - }, - "@atlaskit/tree": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/@atlaskit/tree/-/tree-8.6.2.tgz", - "integrity": "sha512-geVyjCm108G35d+VCJaD3fm4DVMSw09l6v8u+v7oriCddYE5nQHYZ0b7ihyupxbryhpfTyUmaD8LcJgWt8WESQ==", - "requires": { - "@babel/runtime": "^7.0.0", - "css-box-model": "^1.2.0", - "react-beautiful-dnd-next": "11.0.5" - } - }, - "@atlaskit/ufo": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@atlaskit/ufo/-/ufo-0.1.3.tgz", - "integrity": "sha512-Triy6E3Ce8xoT85HF2PVvREDS2y2yzT1Q3bij2S0g6odEh31FsSOESpYPA3N7GhPyWXuIFOVY4tRjXvlOfJbVA==", - "requires": { - "@babel/runtime": "^7.0.0", - "uuid": "^3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "@atlaskit/user-picker": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@atlaskit/user-picker/-/user-picker-9.3.4.tgz", - "integrity": "sha512-cc5uJ6Vs/m4Ae5Igp9E5v0Wqb2wn/dRvMqnXkbzSJd6AUUYhCr4/FxTK1AH6n1882tm92axs9C9ZaVAguD6uxw==", - "requires": { - "@atlaskit/analytics-next": "^8.2.0", - "@atlaskit/avatar": "^21.0.0", - "@atlaskit/icon": "^21.10.0", - "@atlaskit/logo": "^13.8.0", - "@atlaskit/lozenge": "^11.0.0", - "@atlaskit/popper": "^5.0.0", - "@atlaskit/select": "^15.6.0", - "@atlaskit/spinner": "^15.1.4", - "@atlaskit/theme": "^12.1.0", - "@atlaskit/tokens": "^0.10.0", - "@atlaskit/tooltip": "^17.5.0", - "@atlaskit/ufo": "^0.1.0", - "@babel/runtime": "^7.0.0", - "@emotion/core": "^10.0.9", - "lodash": "^4.17.21", - "memoize-one": "^6.0.0", - "uuid": "^3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "@atlaskit/visually-hidden": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@atlaskit/visually-hidden/-/visually-hidden-1.1.0.tgz", - "integrity": "sha512-z/M9ivFDdOx0HHQ9ifi+eEt7uGyqnpNztYGA2J6vklfWJ30Fjtz3yGmZXwiSVrhOI1MXvwx55mxOg7PnR93DLw==", - "requires": { - "@babel/runtime": "^7.0.0", - "@emotion/react": "^11.7.1" - } - }, - "@atlaskit/width-detector": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@atlaskit/width-detector/-/width-detector-4.0.2.tgz", - "integrity": "sha512-aYA9t7N4x3dnrEjjP5aQbR1oDE+apJtO50IPa4mB7uPj2sgydHjVME7IOEZ2Xbub8dm/lSIaQHz6/a6M3T89Mw==", - "requires": { - "@babel/runtime": "^7.0.0", - "raf-schd": "^4.0.3" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", - "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==" - }, - "@babel/core": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", - "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.13", - "@babel/types": "^7.18.13", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" - }, - "dependencies": { - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/eslint-parser": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", - "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", - "dev": true, - "requires": { - "eslint-scope": "^5.1.1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", - "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", - "requires": { - "@babel/types": "^7.18.13", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", - "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.20.2", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.13.tgz", - "integrity": "sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", - "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz", - "integrity": "sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", - "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", - "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz", - "integrity": "sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==" - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz", - "integrity": "sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz", - "integrity": "sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" - }, - "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" - }, - "@babel/helper-wrap-function": { - "version": "7.18.11", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz", - "integrity": "sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.18.9", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.11", - "@babel/types": "^7.18.10" - } - }, - "@babel/helpers": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", - "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", - "requires": { - "@babel/template": "^7.18.6", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", - "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==" - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-decorators": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.10.tgz", - "integrity": "sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.18.6" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz", - "integrity": "sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-decorators": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.18.6.tgz", - "integrity": "sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-flow": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz", - "integrity": "sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz", - "integrity": "sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz", - "integrity": "sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz", - "integrity": "sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz", - "integrity": "sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-flow-strip-types": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.18.9.tgz", - "integrity": "sha512-+G6rp2zRuOAInY5wcggsx4+QVao1qPM0osC9fTUVlAV3zOrzTCnrMAFVnR6+a3T8wz1wFIH7KhYMcMB3u1n80A==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-flow": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz", - "integrity": "sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz", - "integrity": "sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz", - "integrity": "sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-identifier": "^7.18.6", - "babel-plugin-dynamic-import-node": "^2.3.3" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", - "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-constant-elements": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.12.tgz", - "integrity": "sha512-Q99U9/ttiu+LMnRU8psd23HhvwXmKWDQIpocm0JKaICcZHnw+mdQbHm6xnSy7dOl8I5PELakYtNBubNQlBXbZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.10.tgz", - "integrity": "sha512-gCy7Iikrpu3IZjYZolFE4M1Sm+nrh1/6za2Ewj77Z+XirT4TsbJcvOFOyF+fRPwU6AKKK136CZxx6L8AbSFG6A==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-jsx": "^7.18.6", - "@babel/types": "^7.18.10" - } - }, - "@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, - "requires": { - "@babel/plugin-transform-react-jsx": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx-self": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", - "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-jsx-source": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", - "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz", - "integrity": "sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typescript": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz", - "integrity": "sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-typescript": "^7.18.6" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" - } - }, - "@babel/preset-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", - "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-typescript": "^7.18.6" - } - }, - "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", - "requires": { - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/runtime-corejs2": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.18.9.tgz", - "integrity": "sha512-l057ZarpDX2QnXM89ViR2BgRFgTy2l5UFGDt0SbInhim1N/ljBgPeTJV0kRG1/Bo7CkHfYfrNNwTeQ2CPph9xQ==", - "requires": { - "core-js": "^2.6.12", - "regenerator-runtime": "^0.13.4" - }, - "dependencies": { - "core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" - } - } - }, - "@babel/runtime-corejs3": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.9.tgz", - "integrity": "sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==", - "dev": true, - "requires": { - "core-js-pure": "^3.20.2", - "regenerator-runtime": "^0.13.4" - } - }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" - } - }, - "@babel/traverse": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", - "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.13", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.18.13", - "@babel/types": "^7.18.13", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.18.13", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", - "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@blocknote/core": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@blocknote/core/-/core-0.1.0.tgz", - "integrity": "sha512-ElqKLvGkaa9j1+3itnVk8Lvzoxit5AlC4gbTdjlfwp5uoXrLFhSb2bOetDj0CVsgmQxPXv9c4vztwHuojssVxQ==", - "requires": { - "@atlaskit/button": "^16.3.5", - "@atlaskit/dropdown-menu": "^11.1.2", - "@atlaskit/menu": "^1.3.0", - "@atlaskit/theme": "^12.1.4", - "@tippyjs/react": "^4.2.6", - "@tiptap/core": "^2.0.0-beta.182", - "@tiptap/extension-bold": "^2.0.0-beta.28", - "@tiptap/extension-code": "^2.0.0-beta.28", - "@tiptap/extension-collaboration": "^2.0.0-beta.38", - "@tiptap/extension-collaboration-cursor": "^2.0.0-beta.37", - "@tiptap/extension-dropcursor": "^2.0.0-beta.29", - "@tiptap/extension-gapcursor": "^2.0.0-beta.39", - "@tiptap/extension-hard-break": "^2.0.0-beta.33", - "@tiptap/extension-history": "^2.0.0-beta.26", - "@tiptap/extension-horizontal-rule": "^2.0.0-beta.36", - "@tiptap/extension-italic": "^2.0.0-beta.28", - "@tiptap/extension-link": "^2.0.0-beta.43", - "@tiptap/extension-paragraph": "^2.0.0-beta.26", - "@tiptap/extension-strike": "^2.0.0-beta.29", - "@tiptap/extension-text": "^2.0.0-beta.17", - "@tiptap/extension-underline": "^2.0.0-beta.25", - "@tiptap/react": "^2.0.0-beta.114", - "lodash": "^4.17.21", - "prosemirror-model": "1.18.1", - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "react": "^17.0.2", - "react-dom": "^17.0.2", - "react-icons": "^4.3.1", - "styled-components": "^5.3.3", - "uuid": "^8.3.2" - }, - "dependencies": { - "@tiptap/react": { - "version": "2.0.0-beta.114", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.0.0-beta.114.tgz", - "integrity": "sha512-9JbRE+16WM6RxbBxzY74SrJtLodvjeRBnEbWxuhxVgGKxMunRj6r8oED87ODJgqLmkpofwE0KFHTPGdEXfdcKA==", - "requires": { - "@tiptap/extension-bubble-menu": "^2.0.0-beta.61", - "@tiptap/extension-floating-menu": "^2.0.0-beta.56", - "prosemirror-view": "1.26.2" - } - }, - "css-to-react-native": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.0.0.tgz", - "integrity": "sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "react-dom": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", - "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - } - }, - "scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "styled-components": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", - "integrity": "sha512-ndETJ9RKaaL6q41B69WudeqLzOpY1A/ET/glXkNZ2T7dPjPqpPCXXQjDFYZWwNnE5co0wX+gTCqx9mfxTmSIPg==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@deck.gl/aggregation-layers": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-8.8.9.tgz", - "integrity": "sha512-quXUDBeyFau77mlYGmLeGpCzd5NjChdt5+SMG7X7VmxrZuUh6zNP381J1+t6WlNShZdUwjhPKvRQDSYyXo2nIA==", - "requires": { - "@luma.gl/constants": "^8.5.16", - "@luma.gl/shadertools": "^8.5.16", - "@math.gl/web-mercator": "^3.6.2", - "d3-hexbin": "^0.2.1" - } - }, - "@deck.gl/core": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.8.9.tgz", - "integrity": "sha512-fRbN/EpoFT2935qlSXrGltUsUFr7Qia8yegLfjRkK244bJX6ptuaRee1GZAeqpCVaWQRbXOM11C2NEe3d64oNg==", - "requires": { - "@loaders.gl/core": "^3.2.5", - "@loaders.gl/images": "^3.2.5", - "@luma.gl/constants": "^8.5.16", - "@luma.gl/core": "^8.5.16", - "@math.gl/core": "^3.6.2", - "@math.gl/sun": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@probe.gl/stats": "^3.5.0", - "gl-matrix": "^3.0.0", - "math.gl": "^3.6.2", - "mjolnir.js": "^2.7.0" - } - }, - "@deck.gl/layers": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-8.8.9.tgz", - "integrity": "sha512-IwpTfYU2yJdybP4hD2p4A/JZ3jqCzkwpjKxrig43Q4OeR9oNmotS1DOyqD70sF4Al8xOPV9/WxPCht4O7/Pbrw==", - "requires": { - "@loaders.gl/images": "^3.2.5", - "@loaders.gl/schema": "^3.2.5", - "@luma.gl/constants": "^8.5.16", - "@mapbox/tiny-sdf": "^1.1.0", - "@math.gl/core": "^3.6.2", - "@math.gl/polygon": "^3.6.2", - "@math.gl/web-mercator": "^3.6.2", - "earcut": "^2.0.6" - } - }, - "@deck.gl/react": { - "version": "8.8.9", - "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-8.8.9.tgz", - "integrity": "sha512-muCUYVnpKuvxvPnOajpMUADeYQCSemnWjsZgUZGyItn00CbntWWQK889TnZFUNLsBY04XZV3oLTqV9SXL+PaoQ==", - "requires": {} - }, - "@emotion/babel-plugin": { - "version": "11.10.2", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.2.tgz", - "integrity": "sha512-xNQ57njWTFVfPAc3cjfuaPdsgLp5QOSuRsj9MA6ndEhH/AzuZM86qIQzt6rq+aGBwj3n5/TkLmU5lhAfdRmogA==", - "requires": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/plugin-syntax-jsx": "^7.17.12", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.0", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.0.13" - }, - "dependencies": { - "@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", - "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "@emotion/cache": { - "version": "10.0.29", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz", - "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==", - "requires": { - "@emotion/sheet": "0.9.4", - "@emotion/stylis": "0.8.5", - "@emotion/utils": "0.11.3", - "@emotion/weak-memoize": "0.2.5" - } - }, - "@emotion/core": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.3.1.tgz", - "integrity": "sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==", - "requires": { - "@babel/runtime": "^7.5.5", - "@emotion/cache": "^10.0.27", - "@emotion/css": "^10.0.27", - "@emotion/serialize": "^0.11.15", - "@emotion/sheet": "0.9.4", - "@emotion/utils": "0.11.3" - } - }, - "@emotion/css": { - "version": "10.0.27", - "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz", - "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==", - "requires": { - "@emotion/serialize": "^0.11.15", - "@emotion/utils": "0.11.3", - "babel-plugin-emotion": "^10.0.27" - } - }, - "@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" - }, - "@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", - "requires": { - "@emotion/memoize": "^0.8.0" - } - }, - "@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" - }, - "@emotion/react": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.4.tgz", - "integrity": "sha512-j0AkMpr6BL8gldJZ6XQsQ8DnS9TxEQu1R+OGmDZiWjBAJtCcbt0tS3I/YffoqHXxH6MjgI7KdMbYKw3MEiU9eA==", - "requires": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.0", - "@emotion/cache": "^11.10.0", - "@emotion/serialize": "^1.1.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "hoist-non-react-statics": "^3.3.1" - }, - "dependencies": { - "@emotion/cache": { - "version": "11.10.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", - "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", - "requires": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.0.13" - } - }, - "@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", - "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "@emotion/sheet": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz", - "integrity": "sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==" - }, - "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" - }, - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - } - } - }, - "@emotion/serialize": { - "version": "0.11.16", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz", - "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==", - "requires": { - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/unitless": "0.7.5", - "@emotion/utils": "0.11.3", - "csstype": "^2.5.7" - }, - "dependencies": { - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - } - } - }, - "@emotion/sheet": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz", - "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==" - }, - "@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" - }, - "@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" - }, - "@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", - "requires": {} - }, - "@emotion/utils": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz", - "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==" - }, - "@emotion/weak-memoize": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", - "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" - }, - "@esbuild-plugins/node-globals-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.1.1.tgz", - "integrity": "sha512-MR0oAA+mlnJWrt1RQVQ+4VYuRJW/P2YmRTv1AsplObyvuBMnPHiizUF95HHYiSsMGLhyGtWufaq2XQg6+iurBg==", - "dev": true, - "requires": {} - }, - "@esbuild-plugins/node-modules-polyfill": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.1.4.tgz", - "integrity": "sha512-uZbcXi0zbmKC/050p3gJnne5Qdzw8vkXIv+c2BW0Lsc1ji1SkrxbKPUy5Efr0blbTu1SL8w4eyfpnSdPg3G0Qg==", - "dev": true, - "requires": { - "escape-string-regexp": "^4.0.0", - "rollup-plugin-node-polyfills": "^0.2.1" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - } - } - }, - "@esbuild/linux-loong64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.6.tgz", - "integrity": "sha512-hqmVU2mUjH6J2ZivHphJ/Pdse2ZD+uGCHK0uvsiLDk/JnSedEVj77CiVUnbMKuU4tih1TZZL8tG9DExQg/GZsw==", - "dev": true, - "optional": true, - "peer": true - }, - "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.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" - }, - "dependencies": { - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "@formatjs/ecma402-abstract": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.11.4.tgz", - "integrity": "sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==", - "requires": { - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, - "@formatjs/fast-memoize": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.1.tgz", - "integrity": "sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@formatjs/icu-messageformat-parser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.0.tgz", - "integrity": "sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-skeleton-parser": "1.3.6", - "tslib": "^2.1.0" - } - }, - "@formatjs/icu-skeleton-parser": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.6.tgz", - "integrity": "sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "tslib": "^2.1.0" - } - }, - "@formatjs/intl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.2.1.tgz", - "integrity": "sha512-vgvyUOOrzqVaOFYzTf2d3+ToSkH2JpR7x/4U1RyoHQLmvEaTQvXJ7A2qm1Iy3brGNXC/+/7bUlc3lpH+h/LOJA==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/fast-memoize": "1.2.1", - "@formatjs/icu-messageformat-parser": "2.1.0", - "@formatjs/intl-displaynames": "5.4.3", - "@formatjs/intl-listformat": "6.5.3", - "intl-messageformat": "9.13.0", - "tslib": "^2.1.0" - } - }, - "@formatjs/intl-displaynames": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-5.4.3.tgz", - "integrity": "sha512-4r12A3mS5dp5hnSaQCWBuBNfi9Amgx2dzhU4lTFfhSxgb5DOAiAbMpg6+7gpWZgl4ahsj3l2r/iHIjdmdXOE2Q==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, - "@formatjs/intl-listformat": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-6.5.3.tgz", - "integrity": "sha512-ozpz515F/+3CU+HnLi5DYPsLa6JoCfBggBSSg/8nOB5LYSFW9+ZgNQJxJ8tdhKYeODT+4qVHX27EeJLoxLGLNg==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/intl-localematcher": "0.2.25", - "tslib": "^2.1.0" - } - }, - "@formatjs/intl-localematcher": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.25.tgz", - "integrity": "sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@lerna/add": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-5.3.0.tgz", - "integrity": "sha512-MxwTO2UBxZwwuquKbBqdYa56YTqg6Lfz1MZsRQxO7F2cb2NN8NEYTcGOli/71Ee/2AoX4R4xIFTh3TnaflQ25A==", - "dev": true, - "requires": { - "@lerna/bootstrap": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "npm-package-arg": "8.1.1", - "p-map": "^4.0.0", - "pacote": "^13.6.1", - "semver": "^7.3.4" - } - }, - "@lerna/bootstrap": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.3.0.tgz", - "integrity": "sha512-iHVjt6YOQKLY0j+ex13a6ZxjIQ1TSSXqbl6z1hVjBFaDyCh7pra/tgj0LohZDVCaouLwRKucceQfTGrb+cfo7A==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/has-npm-version": "5.3.0", - "@lerna/npm-install": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/rimraf-dir": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/symlink-binary": "5.3.0", - "@lerna/symlink-dependencies": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@npmcli/arborist": "5.3.0", - "dedent": "^0.7.0", - "get-port": "^5.1.1", - "multimatch": "^5.0.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4" - } - }, - "@lerna/changed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.3.0.tgz", - "integrity": "sha512-i6ZfBDBZCpnPaSWTuNGTrnExkHNMC+/cSUuS9njaqe+tXgqE95Ja3cMxWZth9Q1uasjcEBHPU2jG0VKrU37rpA==", - "dev": true, - "requires": { - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/listable": "5.3.0", - "@lerna/output": "5.3.0" - } - }, - "@lerna/check-working-tree": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-5.3.0.tgz", - "integrity": "sha512-qo6jUGWXKLVL1nU8aEECqwrGRjs9o1l1hXdD2juA4Fvzsam1cFVHJwsmw3hAXGhEPD0oalg/XR62H9rZSCLOvQ==", - "dev": true, - "requires": { - "@lerna/collect-uncommitted": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "@lerna/validation-error": "5.3.0" - } - }, - "@lerna/child-process": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-5.3.0.tgz", - "integrity": "sha512-4uXPNIptrgQQQVHVVAXBD8F7IqSvZL3Og0G0DHiWKH+dsSyMIUtaIGJt7sifVoL7nzex4AqEiPq/AubpmG5g4Q==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "execa": "^5.0.0", - "strong-log-transformer": "^2.1.0" - } - }, - "@lerna/clean": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.3.0.tgz", - "integrity": "sha512-Jn+Dr7A69dch8m1dLe7l/SDVQVQT2j7zdy2gaZVEmJIgEEaXmEbfJ2t2n06vRXtckI9B85M5mubT1U3Y7KuNuA==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/rimraf-dir": "5.3.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0", - "p-waterfall": "^2.1.1" - } - }, - "@lerna/cli": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-5.3.0.tgz", - "integrity": "sha512-P7F3Xs98pXMEGZX+mnFfsd6gU03x8UrwQ3mElvQBICl4Ew9z6rS8NGUd3JOPFzm4/vSTjYTnPyPdWBjj6/f6sw==", - "dev": true, - "requires": { - "@lerna/global-options": "5.3.0", - "dedent": "^0.7.0", - "npmlog": "^6.0.2", - "yargs": "^16.2.0" - } - }, - "@lerna/collect-uncommitted": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-5.3.0.tgz", - "integrity": "sha512-Ll/mU9Nes0NQoa0pSv2TR2PTCkIomBGuDWH48OF2sKKu69NuLjrD2L0udS5nJYig9HxFewtm4QTiUdYPxfJXkQ==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "chalk": "^4.1.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/collect-updates": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.3.0.tgz", - "integrity": "sha512-fzJo/rmdXKWKYt+9IXjtenIZtSr3blMH8GEqoVKpSZ7TJGpxcFNmMe6foa60BgaTnDmmg1y7Qu6JbQJ3Ra5c5w==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "minimatch": "^3.0.4", - "npmlog": "^6.0.2", - "slash": "^3.0.0" - } - }, - "@lerna/command": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-5.3.0.tgz", - "integrity": "sha512-UNQQ4EGTumqLhOuDPcRA4LpdS9pcTYKSdh/8MdKPeyIRN70vCTwdeTrxqaaKsn3Jo7ycvyUQT5yfrUFmCClfoA==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/project": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@lerna/write-log-file": "5.3.0", - "clone-deep": "^4.0.1", - "dedent": "^0.7.0", - "execa": "^5.0.0", - "is-ci": "^2.0.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/conventional-commits": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-5.3.0.tgz", - "integrity": "sha512-9uoQ2E1J7pL0fml5PNO7FydnBNeqrNOQa53Ca1Klf5t/x4vIn51ocOZNm/YbRAc/affnrxxp+gR2/SWlN0yKqQ==", - "dev": true, - "requires": { - "@lerna/validation-error": "5.3.0", - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-core": "^4.2.4", - "conventional-recommended-bump": "^6.1.0", - "fs-extra": "^9.1.0", - "get-stream": "^6.0.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "pify": "^5.0.0", - "semver": "^7.3.4" - } - }, - "@lerna/create": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.3.0.tgz", - "integrity": "sha512-DotTReCc3+Q9rpMA8RKAGemUK7JXT7skbxHvpqpPj7ryNkIv/dNAFC2EHglcpt9Rmyo6YbSP2zk0gfDbdiIcVA==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "globby": "^11.0.2", - "init-package-json": "^3.0.2", - "npm-package-arg": "8.1.1", - "p-reduce": "^2.1.0", - "pacote": "^13.6.1", - "pify": "^5.0.0", - "semver": "^7.3.4", - "slash": "^3.0.0", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0", - "whatwg-url": "^8.4.0", - "yargs-parser": "20.2.4" - } - }, - "@lerna/create-symlink": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-5.3.0.tgz", - "integrity": "sha512-xIoC9m4J/u4NV/8ms4P2fiimaYgialqJvNamvMDRmgE1c3BLDSGk2nE4nVI2W5LxjgJdMTiIH9v1QpTUC9Fv+Q==", - "dev": true, - "requires": { - "cmd-shim": "^5.0.0", - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/describe-ref": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.3.0.tgz", - "integrity": "sha512-R+CtJcOuAF3kJ6GNQnGC3STEi+5OtpNVz2n17sAs/xqJnq79tPdzEhT+pMxB2eSEkQYlSr+cCKMpF0m/mtIPQA==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/diff": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-5.3.0.tgz", - "integrity": "sha512-i6f99dtO90u1QIJEfVtKE831m4gnMHBwY+4D84GY2SJMno8uI7ZyxMRZQh1nAFtvlNozO2MgzLr1OHtNMZOIgQ==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/validation-error": "5.3.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/exec": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-5.3.0.tgz", - "integrity": "sha512-kI/IuF1hbT+pEMZc3v4+w8BLckUIi45ipzOP0bWvXNgSKKuADAU3HLv+ifRXEjob5906C+Zc7K2IVoVS6r1TDg==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/profiler": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/validation-error": "5.3.0", - "p-map": "^4.0.0" - } - }, - "@lerna/filter-options": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-5.3.0.tgz", - "integrity": "sha512-ddgy0oDisTKIhCJ4WY5CeEhTsyrbW+zeBvZ7rVaG0oQXjSSYBried4TXRvgy67fampfHoPX+eQq5l1SYTRFPlw==", - "dev": true, - "requires": { - "@lerna/collect-updates": "5.3.0", - "@lerna/filter-packages": "5.3.0", - "dedent": "^0.7.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/filter-packages": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-5.3.0.tgz", - "integrity": "sha512-5/2V50sQB2+JNwuCHP/UPm3y8PN2JWVY9CbNLtF3K5bymNsCkQh2KHEL9wlWZ4yfr/2ufpy4XFPaFUHNoUOGnQ==", - "dev": true, - "requires": { - "@lerna/validation-error": "5.3.0", - "multimatch": "^5.0.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/get-npm-exec-opts": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-5.3.0.tgz", - "integrity": "sha512-cYBypDo8C7f4MvVvap2nYgtk8MXAADrYU1VdECSJ3Stbe4p2vBGt8bM9xkS2uPfQFMK3YSy3YPkSZcSjVXyoGw==", - "dev": true, - "requires": { - "npmlog": "^6.0.2" - } - }, - "@lerna/get-packed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-5.3.0.tgz", - "integrity": "sha512-kD12w7Ko5TThuOuPF2HBLyuPsHK3oyyWyzleGBqR4DqxMtbMRgimyTQnr5o58XBOwUPCFsv1EZiqeGk+3HTGEA==", - "dev": true, - "requires": { - "fs-extra": "^9.1.0", - "ssri": "^9.0.1", - "tar": "^6.1.0" - } - }, - "@lerna/github-client": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-5.3.0.tgz", - "integrity": "sha512-UqAclsWDMthmbv3Z8QE1K7D/4e93ytg31mc+nEj+UdU+xJQ0L1ypl8zWAmGNs1sFkQntIiTIB4W5zgHet5mmZw==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@octokit/plugin-enterprise-rest": "^6.0.1", - "@octokit/rest": "^19.0.3", - "git-url-parse": "^12.0.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/gitlab-client": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-5.3.0.tgz", - "integrity": "sha512-otwbiaGDgvn5MGF1ypsCO48inMpdcxuiDlbxrKD6glPUwNHiGV+PU8LLCCDKimwjjQhl88ySLpL1oTm4jnZ1Aw==", - "dev": true, - "requires": { - "node-fetch": "^2.6.1", - "npmlog": "^6.0.2", - "whatwg-url": "^8.4.0" - } - }, - "@lerna/global-options": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-5.3.0.tgz", - "integrity": "sha512-iEoFrDSU+KtfcB+lHW5grjg3VkEqzZNTUnWnE1FCBBwj9tSLOHjgKGtWWjIQtBUJ+qcLBbusap9Stqzr7UPYpQ==", - "dev": true - }, - "@lerna/has-npm-version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-5.3.0.tgz", - "integrity": "sha512-A/bK8e+QP/VMqZkq1wZbyOzMz/AY92tAVsBOQ5Yw2zqshdMVj99st3YHLOqJf/HTEzQo27GGI/ajmcltHS2l6A==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "semver": "^7.3.4" - } - }, - "@lerna/import": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.3.0.tgz", - "integrity": "sha512-KjVT9oFNSp1JLdrS1LSXjDcLiu2TMSfy6tpmhF9Zxo7oKB21SgWmXVV9rcWDueW2RIxNXDeVUG0NVNj2BRGeEQ==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/validation-error": "5.3.0", - "dedent": "^0.7.0", - "fs-extra": "^9.1.0", - "p-map-series": "^2.1.0" - } - }, - "@lerna/info": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/info/-/info-5.3.0.tgz", - "integrity": "sha512-pyeZSM/PIpBHCXdHPrbh6sPZlngXUxhTVFb0VaIjQ5Ms585xi15s1UQDO3FvzqdyMyalx0QGzCJbNx5XeoCejg==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/output": "5.3.0", - "envinfo": "^7.7.4" - } - }, - "@lerna/init": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-5.3.0.tgz", - "integrity": "sha512-y46lzEtgMdEseTJGQQqYZOjqqd7iN+e14vFh/9q5h62V4Y8nlUJRzovVo8JSeaGwKLB0B3dq3BuUn0PNywMhpA==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/project": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "write-json-file": "^4.3.0" - } - }, - "@lerna/link": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-5.3.0.tgz", - "integrity": "sha512-+QBwnGg3S8Zk8M8G5CA4kmGq92rkEMbmWJXaxie3jQayp+GXgSlLs6R4jwSOZlztY6xR3WawMI9sHJ0Vdu+g7w==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/package-graph": "5.3.0", - "@lerna/symlink-dependencies": "5.3.0", - "p-map": "^4.0.0", - "slash": "^3.0.0" - } - }, - "@lerna/list": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-5.3.0.tgz", - "integrity": "sha512-5RJvle3m4l2H0UmKNlwS8h2OIlNGsNTKPC4DYrJYt0+fhgzf5SEV1QKw+fuUqe3F8MziIkSGQB52HsjwPE6AWQ==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/listable": "5.3.0", - "@lerna/output": "5.3.0" - } - }, - "@lerna/listable": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-5.3.0.tgz", - "integrity": "sha512-RdmeV9mDeuBOgVOlF/KNH/qttyiYwHbeqHiMAw9s9AfMo/Fz3iDZaTGZuruMm84TZSkKxI7m5mjTlC0djsyKog==", - "dev": true, - "requires": { - "@lerna/query-graph": "5.3.0", - "chalk": "^4.1.0", - "columnify": "^1.6.0" - } - }, - "@lerna/log-packed": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.3.0.tgz", - "integrity": "sha512-tDuOot3vSOUSP7fNNej8UM0fah5oy8mKXe026grt4J0OP4L3rhSWxhfrDBQ3Ylh2dAjgHzscUf/vpnNC9HnhOQ==", - "dev": true, - "requires": { - "byte-size": "^7.0.0", - "columnify": "^1.6.0", - "has-unicode": "^2.0.1", - "npmlog": "^6.0.2" - } - }, - "@lerna/npm-conf": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-5.3.0.tgz", - "integrity": "sha512-ejlypb90tvIsKUCb0fcOKt7wcPEjLdVK2zfbNs0M+UlRDLyRVOHUVdelJ15cRDNjQHzhBo2HBUKn5Fmm/2pcmg==", - "dev": true, - "requires": { - "config-chain": "^1.1.12", - "pify": "^5.0.0" - } - }, - "@lerna/npm-dist-tag": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-5.3.0.tgz", - "integrity": "sha512-OPahPk9QLXQXFgtrWm22NNxajVYKavCyTh8ijMwXTGXXbMJAw+PVjokfrUuEtg7FQi+kfJSrYAcJAxxfQq2eiA==", - "dev": true, - "requires": { - "@lerna/otplease": "5.3.0", - "npm-package-arg": "8.1.1", - "npm-registry-fetch": "^13.3.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/npm-install": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-5.3.0.tgz", - "integrity": "sha512-scbWo8nW+P9KfitWG3y7Ep97dOs64ECfz9xfqtjagEXKYBPxG3skvwwljkfNnuxrCNs71JVD+imvcewHzih28g==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/get-npm-exec-opts": "5.3.0", - "fs-extra": "^9.1.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "signal-exit": "^3.0.3", - "write-pkg": "^4.0.0" - } - }, - "@lerna/npm-publish": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-5.3.0.tgz", - "integrity": "sha512-n+ocN1Dxrs6AmrSNqZl57cwhP4/VjQXdEI+QYauNnErNjMQW8Wt+tNaTlVAhZ1DnorwAo86o2uzFF/BgdUqh9A==", - "dev": true, - "requires": { - "@lerna/otplease": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "fs-extra": "^9.1.0", - "libnpmpublish": "^6.0.4", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "pify": "^5.0.0", - "read-package-json": "^5.0.1" - } - }, - "@lerna/npm-run-script": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-5.3.0.tgz", - "integrity": "sha512-2cLR1YdzeMjaMKgDuwHE+iZgVPt+Ttzb3/wFtp7Mw9TlKmNIdbHdrnfl12ABz5knPC+62CCNjB/gznfLndPp2w==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "@lerna/get-npm-exec-opts": "5.3.0", - "npmlog": "^6.0.2" - } - }, - "@lerna/otplease": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-5.3.0.tgz", - "integrity": "sha512-Xpju2VC5TiycmBP/mdp9hRstkH2MLm8/7o2NotVTCJwASWdKphRMqezhh5BX0E9i6VyrjzmTqSYEh9FNZZ9MwQ==", - "dev": true, - "requires": { - "@lerna/prompt": "5.3.0" - } - }, - "@lerna/output": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/output/-/output-5.3.0.tgz", - "integrity": "sha512-fISmHDu/9PKInFmT5NXsbh8cR6aE6SUXWrteXJ6PBYK30s0f/pVcfswb9VccX0Yea8HmqMQgCHWUWifkZeXiRA==", - "dev": true, - "requires": { - "npmlog": "^6.0.2" - } - }, - "@lerna/pack-directory": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-5.3.0.tgz", - "integrity": "sha512-dTGMUB6/GjExhmLZ8yeFaRKJuSm6M/IsfxSJdL4gFPLigUIAS4XhzXS3KnL0+Ef1ue1yaTlAE9c/czfkE0pc/w==", - "dev": true, - "requires": { - "@lerna/get-packed": "5.3.0", - "@lerna/package": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/temp-write": "5.3.0", - "npm-packlist": "^5.1.1", - "npmlog": "^6.0.2", - "tar": "^6.1.0" - } - }, - "@lerna/package": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-5.3.0.tgz", - "integrity": "sha512-hsB03miiaNdvZ/UGzl0sVqxVat5x33EG9JiYgIoFqzroQPrG+WShmX3ctuO06TY1pxb4iNuHLPIbQomHEzzj8w==", - "dev": true, - "requires": { - "load-json-file": "^6.2.0", - "npm-package-arg": "8.1.1", - "write-pkg": "^4.0.0" - } - }, - "@lerna/package-graph": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-5.3.0.tgz", - "integrity": "sha512-UEHY7l/yknwFvQgo0RifyY+B5QdzuFutLZYSN1BMmyWttOZD9rkM263qnLNGTZ2BUE4dXDwwwOHuhLvi+xDRsA==", - "dev": true, - "requires": { - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/validation-error": "5.3.0", - "npm-package-arg": "8.1.1", - "npmlog": "^6.0.2", - "semver": "^7.3.4" - } - }, - "@lerna/prerelease-id-from-version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.3.0.tgz", - "integrity": "sha512-o1wsLns6hFTsmk4iqTRJNWLnFzlBBwgu17hp8T2iU4U7LUlDT2ZSKV3smGAU6GfrwX3MAp4LZ5syxgjFjrUOnw==", - "dev": true, - "requires": { - "semver": "^7.3.4" - } - }, - "@lerna/profiler": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.3.0.tgz", - "integrity": "sha512-LEZYca29EPgZR0q5E+7CJkn25Cw3OxNMQJU/CVn/HGeoWYWOpoDxujrZBl8is2bw06LHXvRbVXEUATLc+ACbqQ==", - "dev": true, - "requires": { - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2", - "upath": "^2.0.1" - } - }, - "@lerna/project": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-5.3.0.tgz", - "integrity": "sha512-InhIo9uwT1yod72ai5SKseJSUk8KkqG6COmwp1/45vibbawb7ZLbokpns7n46A0NdGNlmwJolamybYOuyumejw==", - "dev": true, - "requires": { - "@lerna/package": "5.3.0", - "@lerna/validation-error": "5.3.0", - "cosmiconfig": "^7.0.0", - "dedent": "^0.7.0", - "dot-prop": "^6.0.1", - "glob-parent": "^5.1.1", - "globby": "^11.0.2", - "load-json-file": "^6.2.0", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "resolve-from": "^5.0.0", - "write-json-file": "^4.3.0" - } - }, - "@lerna/prompt": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-5.3.0.tgz", - "integrity": "sha512-4bIusBdjpw665CJtFsVsaB55hLHnmKnrcOaRjna6N/MdJDl8Th6X4EM4rrfXTX/uUNR3XcV91lYqcLuLmrpm5w==", - "dev": true, - "requires": { - "inquirer": "^8.2.4", - "npmlog": "^6.0.2" - } - }, - "@lerna/publish": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-5.3.0.tgz", - "integrity": "sha512-T8T1BQdI+NnlVARKwIXzILknEuiQlZToBsDpuX06M7+45t/pp9Z+u6pVt3rrqwiUPZ/dpoZzYKI31YdNJtGMcQ==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "5.3.0", - "@lerna/child-process": "5.3.0", - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/describe-ref": "5.3.0", - "@lerna/log-packed": "5.3.0", - "@lerna/npm-conf": "5.3.0", - "@lerna/npm-dist-tag": "5.3.0", - "@lerna/npm-publish": "5.3.0", - "@lerna/otplease": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/pack-directory": "5.3.0", - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/pulse-till-done": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/validation-error": "5.3.0", - "@lerna/version": "5.3.0", - "fs-extra": "^9.1.0", - "libnpmaccess": "^6.0.3", - "npm-package-arg": "8.1.1", - "npm-registry-fetch": "^13.3.0", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "pacote": "^13.6.1", - "semver": "^7.3.4" - } - }, - "@lerna/pulse-till-done": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.3.0.tgz", - "integrity": "sha512-yNvSuPLT1ZTtD2LMVOmiDhw4+9qkyf6xCpfxiUp4cGEN+qIuazWB5JicKLE49o27DBdaG8Ao4lAlb16x/gNrwQ==", - "dev": true, - "requires": { - "npmlog": "^6.0.2" - } - }, - "@lerna/query-graph": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-5.3.0.tgz", - "integrity": "sha512-t99lNj97/Vilp5Js1Be7MoyaZ5U0fbOFh0E7lnTfSLvZhTkPMK6xLvAx2M3NQqhwYCQjTFDuf9ozQ3HQtYZAmA==", - "dev": true, - "requires": { - "@lerna/package-graph": "5.3.0" - } - }, - "@lerna/resolve-symlink": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-5.3.0.tgz", - "integrity": "sha512-zKI7rV5FzzlMBfi6kjDS0ulzcdDTORvdOJ/+CHU5C2h+v+P64Nk2VhZZNCCBDoO/l4GRhgehZOB70GIamO1TSw==", - "dev": true, - "requires": { - "fs-extra": "^9.1.0", - "npmlog": "^6.0.2", - "read-cmd-shim": "^3.0.0" - } - }, - "@lerna/rimraf-dir": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-5.3.0.tgz", - "integrity": "sha512-/QJebh0tSY3LjgEyOo+6NH/b7ZNw9IpjqiDtvnLixjtdfkgli1OKOoZTa4KrO0mJoqMRq4yAa98cjpIzyKqCqw==", - "dev": true, - "requires": { - "@lerna/child-process": "5.3.0", - "npmlog": "^6.0.2", - "path-exists": "^4.0.0", - "rimraf": "^3.0.2" - } - }, - "@lerna/run": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-5.3.0.tgz", - "integrity": "sha512-KwoKTj1w71OmUHONNYhZME+tr5lk9Q4f+3LUr2WtWZRuOAGO5ZCRrcZc+N4Ib7zno89Ub6Ovz51fcjwltLh72w==", - "dev": true, - "requires": { - "@lerna/command": "5.3.0", - "@lerna/filter-options": "5.3.0", - "@lerna/npm-run-script": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/profiler": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/timer": "5.3.0", - "@lerna/validation-error": "5.3.0", - "p-map": "^4.0.0" - } - }, - "@lerna/run-lifecycle": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-5.3.0.tgz", - "integrity": "sha512-EuBCGwm2PLgkebfyqo3yNkwfSb1EzHeo3lA8t4yld6LXWkgUPBFhc7RwRc6TsQOpjpfFvDSGoI282R01o0jPVQ==", - "dev": true, - "requires": { - "@lerna/npm-conf": "5.3.0", - "@npmcli/run-script": "^4.1.7", - "npmlog": "^6.0.2", - "p-queue": "^6.6.2" - } - }, - "@lerna/run-topologically": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-5.3.0.tgz", - "integrity": "sha512-WiFF2EiwLjAguKs0lEmcukTL7WhuWFwxNprrGWFxEkBhlGdMFk18n8BaZN8FO26xqzztzuPzSx1re/f/dEEAPg==", - "dev": true, - "requires": { - "@lerna/query-graph": "5.3.0", - "p-queue": "^6.6.2" - } - }, - "@lerna/symlink-binary": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-5.3.0.tgz", - "integrity": "sha512-dIATASuGS6y512AGjacOoTpkFDPsKlhggjzL3KLdSNmxV3288nUqaFBuA7rTnnMNnBQ7jVuE1JKJupZnzPN0cA==", - "dev": true, - "requires": { - "@lerna/create-symlink": "5.3.0", - "@lerna/package": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0" - } - }, - "@lerna/symlink-dependencies": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-5.3.0.tgz", - "integrity": "sha512-qkq4YT/Bdrb3W22ve+d2Gy3hRTrtT/zBhjKTCukEpYsFJLwSjZ4z5vbv6J15/j6PN1Km9oTRp6vBYmdjAuARQQ==", - "dev": true, - "requires": { - "@lerna/create-symlink": "5.3.0", - "@lerna/resolve-symlink": "5.3.0", - "@lerna/symlink-binary": "5.3.0", - "fs-extra": "^9.1.0", - "p-map": "^4.0.0", - "p-map-series": "^2.1.0" - } - }, - "@lerna/temp-write": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-5.3.0.tgz", - "integrity": "sha512-AhC5Q+tV0yebEc1P2jsB4apQzztW8dgdLLc1G1Pkt46l5vezRGhZmsj+iUyCsVjpdUSO/UcAq1DbI2Xzhf5arg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "is-stream": "^2.0.0", - "make-dir": "^3.0.0", - "temp-dir": "^1.0.0", - "uuid": "^8.3.2" - } - }, - "@lerna/timer": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-5.3.0.tgz", - "integrity": "sha512-IeDjj1gJtbUPKl2ebpiml9u4k2kRqYF1Dbs6JuWpeC7lGxAx3JcUmkNH2RQ1BYTxk5xc9FKlgNMrZQwhq2K1Ow==", - "dev": true - }, - "@lerna/validation-error": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-5.3.0.tgz", - "integrity": "sha512-GVvnTxx+CNFjXCiJahAu2c/pP2R3DhGuQp4CJUyKegnzGaWK0h5PhlwRL7/LbDMPLh2zLobPOVr9kTOjwv76Nw==", - "dev": true, - "requires": { - "npmlog": "^6.0.2" - } - }, - "@lerna/version": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-5.3.0.tgz", - "integrity": "sha512-QOQSAdpeP66oQQ20nNZ4NhJS5NtZZDGyz36kP/4BeqjGK6QgtrEmto4+vmWj49w3VJUIXnrqAKHiPkhFUmJm5Q==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "5.3.0", - "@lerna/child-process": "5.3.0", - "@lerna/collect-updates": "5.3.0", - "@lerna/command": "5.3.0", - "@lerna/conventional-commits": "5.3.0", - "@lerna/github-client": "5.3.0", - "@lerna/gitlab-client": "5.3.0", - "@lerna/output": "5.3.0", - "@lerna/prerelease-id-from-version": "5.3.0", - "@lerna/prompt": "5.3.0", - "@lerna/run-lifecycle": "5.3.0", - "@lerna/run-topologically": "5.3.0", - "@lerna/temp-write": "5.3.0", - "@lerna/validation-error": "5.3.0", - "chalk": "^4.1.0", - "dedent": "^0.7.0", - "load-json-file": "^6.2.0", - "minimatch": "^3.0.4", - "npmlog": "^6.0.2", - "p-map": "^4.0.0", - "p-pipe": "^3.1.0", - "p-reduce": "^2.1.0", - "p-waterfall": "^2.1.1", - "semver": "^7.3.4", - "slash": "^3.0.0", - "write-json-file": "^4.3.0" - } - }, - "@lerna/write-log-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.3.0.tgz", - "integrity": "sha512-cmrNAI5+9auUJSuTVrUzt2nb/KX6htgjdw7gGPMI1Tm6cdBIbs67R6LedZ8yvYOLGsXB2Se93vxv5fTgEHWfCw==", - "dev": true, - "requires": { - "npmlog": "^6.0.2", - "write-file-atomic": "^4.0.1" - } - }, - "@loaders.gl/core": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.2.8.tgz", - "integrity": "sha512-C8BNToWgk1tqTzPHuOgP9OYH8P6Inb5fmwz1Fa03vddxIXd4ORoYMleQZSu9x72Dos2dZ476Vs7NYbJbs8KrZw==", - "requires": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/loader-utils": "3.2.8", - "@loaders.gl/worker-utils": "3.2.8", - "@probe.gl/log": "^3.5.0", - "probe.gl": "^3.4.0" - } - }, - "@loaders.gl/images": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.2.8.tgz", - "integrity": "sha512-QD5mGiUmEbZFEuuQpCPB/vGgvlxgRc/OcOlVUz2vxpbvLPjvuTdLQKCLHrCb4DePBIbepwvrcvJRYz91azN6mA==", - "requires": { - "@loaders.gl/loader-utils": "3.2.8" - } - }, - "@loaders.gl/loader-utils": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.2.8.tgz", - "integrity": "sha512-Yp1ixw23tnFNexhP6xPorUj2QeISlzJiyC5oDz+IyFmcpDmQ3qtlD6ChGztkWilnWSohnC2SP+XBZGbpOclgoA==", - "requires": { - "@babel/runtime": "^7.3.1", - "@loaders.gl/worker-utils": "3.2.8", - "@probe.gl/stats": "^3.5.0" - } - }, - "@loaders.gl/schema": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-3.2.8.tgz", - "integrity": "sha512-7Brn+cqGNnaodun0LwnyXtyIX8+73Fr8jQr6TVYZPOHoHXdxVefbJ70bSYlw+tj+dQhWdmqLglUHT0Rxr1gHBQ==", - "requires": { - "@types/geojson": "^7946.0.7", - "apache-arrow": "^4.0.0" - } - }, - "@loaders.gl/worker-utils": { - "version": "3.2.8", - "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.2.8.tgz", - "integrity": "sha512-CY2TvitiNhs6r+wTQ5McDZmAehklWb5Mb7eCt7aWMthRvhgdWpsMch7QOqOcKFCvuy4JkH37NO86LWFMpXeH8w==", - "requires": { - "@babel/runtime": "^7.3.1" - } - }, - "@luma.gl/constants": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-8.5.16.tgz", - "integrity": "sha512-b9JrfhlU4tgQWa7vAzQzzw3yS0NdJBrTEZ6LA9XRKSwVV5VunHXApnrnN4v1oA0AGgnknnUf40PRBZolsVK+7Q==" - }, - "@luma.gl/core": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-8.5.16.tgz", - "integrity": "sha512-w3goHMFEhQFlpoXXygFD6zaZvu4rYvMLfDXThpBMUYm8Y4k46UREFYhsV1aOe1aJlaolsRT/9J2fgSDXr0yA3w==", - "requires": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/engine": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@luma.gl/shadertools": "8.5.16", - "@luma.gl/webgl": "8.5.16" - } - }, - "@luma.gl/engine": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-8.5.16.tgz", - "integrity": "sha512-F9wMLg+ystsXa3oOzLezaD1K7ot+kL69IKIJqVjxNecPLf8E/BxJlKL+AZW7SCluka6pFMlGomog0GnjjCxH8Q==", - "requires": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@luma.gl/shadertools": "8.5.16", - "@luma.gl/webgl": "8.5.16", - "@math.gl/core": "^3.5.0", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" - } - }, - "@luma.gl/gltools": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/gltools/-/gltools-8.5.16.tgz", - "integrity": "sha512-CNCLbKtMRep7tTuB5x3RA7tD70U8XXA8xhABDZs7oAQ0Q/K2EjnwskSUlWzgD3ZPluh6JZzvQBEi4DSmeW3NZA==", - "requires": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@probe.gl/env": "^3.5.0", - "@probe.gl/log": "^3.5.0", - "@types/offscreencanvas": "^2019.7.0" - } - }, - "@luma.gl/shadertools": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-8.5.16.tgz", - "integrity": "sha512-L3M3v6bQhIT8McCeqLvHnLJBmBXYDog1QblF4PVszuIB/WH+cHxZ0I26X2a1eEsVCvdeCrxRBxr42743oyfUNA==", - "requires": { - "@babel/runtime": "^7.0.0", - "@math.gl/core": "^3.5.0" - } - }, - "@luma.gl/webgl": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-8.5.16.tgz", - "integrity": "sha512-vyzr4Mu3+6rKnyu4c5gmTcuDG6xKF49qy316v8oMp45VT0xCQBP17Poq0b0j0VqbGOOtXGI/pxOtr68Ii9fDuA==", - "requires": { - "@babel/runtime": "^7.0.0", - "@luma.gl/constants": "8.5.16", - "@luma.gl/gltools": "8.5.16", - "@probe.gl/env": "^3.5.0", - "@probe.gl/stats": "^3.5.0" - } - }, - "@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "@math.gl/core": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz", - "integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==", - "requires": { - "@babel/runtime": "^7.12.0", - "@math.gl/types": "3.6.3", - "gl-matrix": "^3.4.0" - } - }, - "@math.gl/polygon": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-3.6.3.tgz", - "integrity": "sha512-FivQ1ZnYcAss1wVifOkHP/ZnlfQy1IL/769uzNtiHxwUbW0kZG3yyOZ9I7fwyzR5Hvqt3ErJKHjSYZr0uVlz5g==", - "requires": { - "@math.gl/core": "3.6.3" - } - }, - "@math.gl/sun": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-3.6.3.tgz", - "integrity": "sha512-mrx6CGYYeTNSQttvcw0KVUy+35YDmnjMqpO/o0t06Vcghrt0HNruB/ScRgUSbJrgkbOg1Vcqm23HBd++clzQzw==", - "requires": { - "@babel/runtime": "^7.12.0" - } - }, - "@math.gl/types": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz", - "integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA==" - }, - "@math.gl/web-mercator": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-3.6.3.tgz", - "integrity": "sha512-UVrkSOs02YLehKaehrxhAejYMurehIHPfFQvPFZmdJHglHOU4V2cCUApTVEwOksvCp161ypEqVp+9H6mGhTTcw==", - "requires": { - "@babel/runtime": "^7.12.0", - "gl-matrix": "^3.4.0" - } - }, - "@matrix-org/olm": { - "version": "3.2.12", - "resolved": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.12.tgz", - "integrity": "sha1-C848hvnTakmE08PgffHD+0xnm9k=" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@npmcli/arborist": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.3.0.tgz", - "integrity": "sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==", - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^2.0.3", - "@npmcli/metavuln-calculator": "^3.0.1", - "@npmcli/move-file": "^2.0.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/package-json": "^2.0.0", - "@npmcli/run-script": "^4.1.3", - "bin-links": "^3.0.0", - "cacache": "^16.0.6", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "npm-install-checks": "^5.0.0", - "npm-package-arg": "^9.0.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.0", - "npmlog": "^6.0.2", - "pacote": "^13.6.1", - "parse-conflict-json": "^2.0.1", - "proc-log": "^2.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^9.0.0", - "treeverse": "^2.0.0", - "walk-up-path": "^1.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } - } - }, - "@npmcli/fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.1.tgz", - "integrity": "sha512-1Q0uzx6c/NVNGszePbr5Gc2riSU1zLpNlo/1YWntH+eaPmMgBssAW0qXofCVkpdj3ce4swZtlDYQu+NKiYcptg==", - "dev": true, - "requires": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.1.tgz", - "integrity": "sha512-UU85F/T+F1oVn3IsB/L6k9zXIMpXBuUBE25QDH0SsURwT6IOBqkC7M16uqo2vVZIyji3X1K4XH9luip7YekH1A==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz", - "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^8.0.1", - "minimatch": "^5.0.1", - "read-package-json-fast": "^2.0.3" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@npmcli/metavuln-calculator": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz", - "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", - "dev": true, - "requires": { - "cacache": "^16.0.0", - "json-parse-even-better-errors": "^2.3.1", - "pacote": "^13.0.3", - "semver": "^7.3.5" - } - }, - "@npmcli/move-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", - "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true - }, - "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", - "dev": true - }, - "@npmcli/package-json": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz", - "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.0.tgz", - "integrity": "sha512-e/QgLg7j2wSJp1/7JRl0GC8c7PMX+uYlA/1Tb+IDOLdSM4T7K1VQ9mm9IGU3WRtY5vEIObpqCLb3aCNCug18DA==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", - "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" - } - }, - "@nrwl/cli": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-14.5.4.tgz", - "integrity": "sha512-UYr14hxeYV8p/zt6D6z33hljZJQROJAVxSC+mm72fyVvy88Gt0sQNLfMmOARXur0p/73PSLM0jJ2Sr7Ftsuu+A==", - "dev": true, - "requires": { - "nx": "14.5.4" - } - }, - "@nrwl/tao": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-14.5.4.tgz", - "integrity": "sha512-a2GCuSE8WghjehuU3GVO63KZEnZXXQiqEg137yN/Na+PxwSu68XeaX53SLyzRskTV120YwBBy1YCTNzAZxxsjg==", - "dev": true, - "requires": { - "nx": "14.5.4" - } - }, - "@octokit/auth-token": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.0.tgz", - "integrity": "sha512-MDNFUBcJIptB9At7HiV7VCvU3NcL4GnfCQaP8C5lrxWrRPMJBnemYtehaKSOlaM7AYxeRyj9etenu8LVpSpVaQ==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3" - } - }, - "@octokit/core": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.0.4.tgz", - "integrity": "sha512-sUpR/hc4Gc7K34o60bWC7WUH6Q7T6ftZ2dUmepSyJr9PRF76/qqkWjE2SOEzCqLA5W83SaISymwKtxks+96hPQ==", - "dev": true, - "requires": { - "@octokit/auth-token": "^3.0.0", - "@octokit/graphql": "^5.0.0", - "@octokit/request": "^6.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.0.3", - "before-after-hook": "^2.2.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/endpoint": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz", - "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/graphql": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.0.tgz", - "integrity": "sha512-1ZZ8tX4lUEcLPvHagfIVu5S2xpHYXAmgN0+95eAOPoaVPzCfUXJtA5vASafcpWcO86ze0Pzn30TAx72aB2aguQ==", - "dev": true, - "requires": { - "@octokit/request": "^6.0.0", - "@octokit/types": "^6.0.3", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/openapi-types": { - "version": "12.11.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", - "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==", - "dev": true - }, - "@octokit/plugin-enterprise-rest": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", - "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", - "dev": true - }, - "@octokit/plugin-paginate-rest": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz", - "integrity": "sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA==", - "dev": true, - "requires": { - "@octokit/types": "^6.41.0" - } - }, - "@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "requires": {} - }, - "@octokit/plugin-rest-endpoint-methods": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.2.0.tgz", - "integrity": "sha512-PZ+yfkbZAuRUtqu6Y191/V3eM0KBPx+Yq7nh+ONPdpm3EX4pd5UnK2y2XgO/0AtNum5a4aJCDjqsDuUZ2hWRXw==", - "dev": true, - "requires": { - "@octokit/types": "^6.41.0", - "deprecation": "^2.3.1" - } - }, - "@octokit/request": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.0.tgz", - "integrity": "sha512-7IAmHnaezZrgUqtRShMlByJK33MT9ZDnMRgZjnRrRV9a/jzzFwKGz0vxhFU6i7VMLraYcQ1qmcAOin37Kryq+Q==", - "dev": true, - "requires": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" - } - }, - "@octokit/request-error": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz", - "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==", - "dev": true, - "requires": { - "@octokit/types": "^6.0.3", - "deprecation": "^2.0.0", - "once": "^1.4.0" - } - }, - "@octokit/rest": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz", - "integrity": "sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ==", - "dev": true, - "requires": { - "@octokit/core": "^4.0.0", - "@octokit/plugin-paginate-rest": "^3.0.0", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^6.0.0" - } - }, - "@octokit/types": { - "version": "6.41.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", - "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", - "dev": true, - "requires": { - "@octokit/openapi-types": "^12.11.0" - } - }, - "@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", - "dev": true, - "requires": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - } - }, - "@playwright/test": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.1.tgz", - "integrity": "sha512-IJ4X0yOakXtwkhbnNzKkaIgXe6df7u3H3FnuhI9Jqh+CdO0e/lYQlDLYiyI9cnXK8E7UAppAWP+VqAv6VX7HQg==", - "dev": true, - "requires": { - "@types/node": "*", - "playwright-core": "1.25.1" - }, - "dependencies": { - "playwright-core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.1.tgz", - "integrity": "sha512-lSvPCmA2n7LawD2Hw7gSCLScZ+vYRkhU8xH0AapMyzwN+ojoDqhkH/KIEUxwNu2PjPoE/fcE0wLAksdOhJ2O5g==", - "dev": true - } - } - }, - "@polka/url": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", - "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==", - "dev": true - }, - "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" - }, - "@probe.gl/env": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.5.2.tgz", - "integrity": "sha512-JlNvJ2p6+ObWX7es6n3TycGPTv5CfVrCS8vblI1eHhrFCcZ6RxIo727ffRVwldpp0YTzdgjx3/4fB/1dnVYElw==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "@probe.gl/log": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.5.2.tgz", - "integrity": "sha512-5yo8Dg8LrSltuPBdGlLh/WOvt4LdU7DDHu75GMeiS0fKM+J4IACRpGV8SOrktCj1MWZ6JVHcNQkJnoyZ6G7p/w==", - "requires": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.5.2" - } - }, - "@probe.gl/stats": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.5.2.tgz", - "integrity": "sha512-YKaYXiHF//fgy1OkX38JD70Lc8qxg2Viw8Q2CTNMwGPDJe12wda7kEmMKPJNw2oYLyFUfTzv00KJMA5h18z02w==", - "requires": { - "@babel/runtime": "^7.0.0" - } - }, - "@react-dnd/asap": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-4.0.1.tgz", - "integrity": "sha512-kLy0PJDDwvwwTXxqTFNAAllPHD73AycE9ypWeln/IguoGBEbvFcPDbCV03G52bEcC5E+YgupBE0VzHGdC8SIXg==" - }, - "@react-dnd/invariant": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-2.0.0.tgz", - "integrity": "sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==" - }, - "@react-dnd/shallowequal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz", - "integrity": "sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==" - }, - "@react-loosely-lazy/manifest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@react-loosely-lazy/manifest/-/manifest-1.0.0.tgz", - "integrity": "sha512-FM5xuGt/moK+jWD11fGfdeqTBv1VH6dkQHbZS3VXPLaRAmIl096t1RD9KLTGAhvwOMzQlD+/pQ12B+pPAbXgdQ==" - }, - "@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - } - } - }, - "@rushstack/eslint-patch": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.4.tgz", - "integrity": "sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==", - "dev": true - }, - "@svgr/babel-plugin-add-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-attribute": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", - "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", - "dev": true - }, - "@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", - "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", - "dev": true - }, - "@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", - "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", - "dev": true - }, - "@svgr/babel-plugin-svg-dynamic-title": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", - "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", - "dev": true - }, - "@svgr/babel-plugin-svg-em-dimensions": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", - "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", - "dev": true - }, - "@svgr/babel-plugin-transform-react-native-svg": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", - "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", - "dev": true - }, - "@svgr/babel-plugin-transform-svg-component": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", - "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", - "dev": true - }, - "@svgr/babel-preset": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", - "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", - "dev": true, - "requires": { - "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", - "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", - "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", - "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", - "@svgr/babel-plugin-transform-svg-component": "^5.5.0" - } - }, - "@svgr/core": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", - "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", - "dev": true, - "requires": { - "@svgr/plugin-jsx": "^5.5.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } - } - }, - "@svgr/hast-util-to-babel-ast": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", - "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", - "dev": true, - "requires": { - "@babel/types": "^7.12.6" - } - }, - "@svgr/plugin-jsx": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", - "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@svgr/babel-preset": "^5.5.0", - "@svgr/hast-util-to-babel-ast": "^5.5.0", - "svg-parser": "^2.0.2" - } - }, - "@svgr/plugin-svgo": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", - "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", - "dev": true, - "requires": { - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "svgo": "^1.2.2" - } - }, - "@svgr/webpack": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", - "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/plugin-transform-react-constant-elements": "^7.12.1", - "@babel/preset-env": "^7.12.1", - "@babel/preset-react": "^7.12.5", - "@svgr/core": "^5.5.0", - "@svgr/plugin-jsx": "^5.5.0", - "@svgr/plugin-svgo": "^5.5.0", - "loader-utils": "^2.0.0" - } - }, - "@syncedstore/yjs-reactive-bindings": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@syncedstore/yjs-reactive-bindings/-/yjs-reactive-bindings-0.4.0.tgz", - "integrity": "sha512-J1dk8F3ek1MSW0+/dDHr/EuUuavMiCtRnmFaLyxMBO5rhk3QDLphitquTmUkW27WMucZxmiJBH2DgTlPPauShg==", - "requires": { - "@types/eslint": "6.8.0" - } - }, - "@tippyjs/react": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", - "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", - "requires": { - "tippy.js": "^6.3.1" - } - }, - "@tiptap/core": { - "version": "2.0.0-beta.182", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.0.0-beta.182.tgz", - "integrity": "sha512-MZGkMGnVnWhBzjvpBNwQ9zBz38ndi3Irbf90uCTSArR0kaCVkW4vmyuPuOXd+0SO8Yv/l5oyDdOCpaG3rnQYfw==", - "requires": { - "prosemirror-commands": "1.3.0", - "prosemirror-keymap": "1.2.0", - "prosemirror-model": "1.18.1", - "prosemirror-schema-list": "1.2.0", - "prosemirror-state": "1.4.1", - "prosemirror-transform": "1.6.0", - "prosemirror-view": "1.26.2" - } - }, - "@tiptap/extension-bold": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.28.tgz", - "integrity": "sha512-DY8GOzw9xjmTFrnvTbgHUNxTnDfKrkDgrhe0SUvdkT2udntWp8umPdhPiD3vczLgHOJw6tX68qMRjbsR1ZPcHQ==", - "requires": {} - }, - "@tiptap/extension-bubble-menu": { - "version": "2.0.0-beta.61", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.61.tgz", - "integrity": "sha512-T3Yx+y1sUnXAJjK1CUfsQewSxOpDca9KzKqN2H9c9RZ9UlorR9XmZg6YYW7m9a7adeihj+o3cCO9jRd8dV+nnA==", - "requires": { - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "tippy.js": "^6.3.7" - } - }, - "@tiptap/extension-code": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.0.0-beta.28.tgz", - "integrity": "sha512-QPJ2Gwb1+3NgcC1ZIhvVcb+FsnWWDu5VZXTKXM4mz892i9V2x48uHg5anPiUV6pcolXsW1F5VNbXIHGTUUO6CQ==", - "requires": {} - }, - "@tiptap/extension-collaboration": { - "version": "2.0.0-beta.38", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration/-/extension-collaboration-2.0.0-beta.38.tgz", - "integrity": "sha512-oDrQC5z+pLXEQUofkwuJPtysHlP81eTmnKLjjTAAO8zWey3w+nusb6YuQM1W0JbqVD7lcK6YlS+Za+pSA46IdA==", - "requires": { - "prosemirror-state": "1.4.1", - "y-prosemirror": "1.0.20" - } - }, - "@tiptap/extension-collaboration-cursor": { - "version": "2.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@tiptap/extension-collaboration-cursor/-/extension-collaboration-cursor-2.0.0-beta.37.tgz", - "integrity": "sha512-3M1aFPTwCGKJ7YNxYZGidJbdZcqAYjOoDCuKfIKVCQgAuKLc5TQf2bA+7ftwG0wI72xdTRoadKA/YCwc67KBvg==", - "requires": { - "y-prosemirror": "1.0.20" - } - }, - "@tiptap/extension-dropcursor": { - "version": "2.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.0.0-beta.29.tgz", - "integrity": "sha512-I+joyoFB8pfdXUPLMqdNO08nlB5m2lbu0VQ5dpqdi/HzgVThMZPZA1cW0X8vAUvrALs5/JFRiFoR9hrLN5R5ng==", - "requires": { - "prosemirror-dropcursor": "1.5.0" - } - }, - "@tiptap/extension-floating-menu": { - "version": "2.0.0-beta.56", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.56.tgz", - "integrity": "sha512-j/evHE/6UPGkIgXny9IGcAh0IrcnQmg0b2NBYebs2mqx9xYKYoe+0jVgNdLp/0M3MRgQCzyWTyatBDBFOUR2mw==", - "requires": { - "prosemirror-state": "1.4.1", - "prosemirror-view": "1.26.2", - "tippy.js": "^6.3.7" - } - }, - "@tiptap/extension-gapcursor": { - "version": "2.0.0-beta.39", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.0.0-beta.39.tgz", - "integrity": "sha512-oCyz5WEeQXrEIoa1WXaD52yf1EwMFCXaK1cVzFgUj8lkXJ+nJj+O/Zp0Mg+9/MVR0LYu/kifqVorKNXM4AFA/g==", - "requires": { - "prosemirror-gapcursor": "1.3.0" - } - }, - "@tiptap/extension-hard-break": { - "version": "2.0.0-beta.33", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.0.0-beta.33.tgz", - "integrity": "sha512-41xf0vSV9hcyTFd01ItLq/CjhjgmOFLCrO3UWN/P2E/cIxuDTyXcvjTE/KXeqRCOV3OYd9fVr0wO91hc8Ij1Yg==", - "requires": {} - }, - "@tiptap/extension-history": { - "version": "2.0.0-beta.26", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.0.0-beta.26.tgz", - "integrity": "sha512-ly19uwvdmXG8Fw1KcavXIHi3Qx6JBASOR7394zghOEpW3atpY8nd/8I373rZ8eDUcGOClfaF7bCx2xvIotAAnw==", - "requires": { - "prosemirror-history": "1.3.0" - } - }, - "@tiptap/extension-horizontal-rule": { - "version": "2.0.0-beta.36", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.36.tgz", - "integrity": "sha512-o+Zp7dcn3zAQhtlhZiFB69mTHuH3ZRbGEF7Cbf1D3uX1izotni5zIZbPaFFUT4r6OmVe/vDDt/nopfcGc10ktQ==", - "requires": { - "prosemirror-state": "1.4.1" - } - }, - "@tiptap/extension-italic": { - "version": "2.0.0-beta.28", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.28.tgz", - "integrity": "sha512-/pKRiCfewh7nqiXRD3N4hQHfGrGNOiWPFYZfY35bSpvTms7PDb/MF7xT1CWW23hSpY31BBS+R/a66vlR/gqu7Q==", - "requires": {} - }, - "@tiptap/extension-link": { - "version": "2.0.0-beta.43", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.0.0-beta.43.tgz", - "integrity": "sha512-AYueqfTW713KGVfWSWhVbj4ObeWudgawikm3m0uYcKSdsAz/CfEvOD2/NA0uyQzlxmYLA6Pf8HMxoKGN+O4Cmg==", - "requires": { - "linkifyjs": "^3.0.5", - "prosemirror-model": "1.18.1", - "prosemirror-state": "1.4.1" - } - }, - "@tiptap/extension-paragraph": { - "version": "2.0.0-beta.26", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.0.0-beta.26.tgz", - "integrity": "sha512-WcYsuUa7LLfk0vi7I1dVjdMRu53B52FMMqd+UL1qPdDKVkU3DBsZVwPj+yyfQyqN8Mc/xyg9VacGaiKFLmWNDg==", - "requires": {} - }, - "@tiptap/extension-strike": { - "version": "2.0.0-beta.29", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.0.0-beta.29.tgz", - "integrity": "sha512-zqFuY7GfNmZ/KClt6kxQ+msGo3syqucP/Xnlihxi+/h/G+oTvEwyOIXCtDOltvxcsWH/TUsdr5vzLp0j+Mdc6Q==", - "requires": {} - }, - "@tiptap/extension-text": { - "version": "2.0.0-beta.17", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.0.0-beta.17.tgz", - "integrity": "sha512-OyKL+pqWJEtjyd9/mrsuY1kZh2b3LWpOQDWKtd4aWR4EA0efmQG+7FPwcIeAVEh7ZoqM+/ABCnPjN6IjzIrSfg==", - "requires": {} - }, - "@tiptap/extension-underline": { - "version": "2.0.0-beta.25", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-2.0.0-beta.25.tgz", - "integrity": "sha512-kRDdb/mF6QWzFGV3cQuLh6xyXULXaKPL/TghefoOZhwkdIWV/M3zFar5tsZO54+tbIrzxoVP6t7mO2Y5G/SLDQ==", - "requires": {} - }, - "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true - }, - "@typecell-org/common": { - "version": "file:packages/common", - "requires": { - "@types/uuid": "^8.3.4", - "buffer": "^6.0.3", - "rimraf": "^3.0.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "string.prototype.replaceall": "^1.0.5", - "typescript": "4.5.5", - "uuid": "^8.3.2" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - } - } - }, - "@typecell-org/editor": { - "version": "file:packages/editor", - "requires": { - "@atlaskit/atlassian-navigation": "^2.2.6", - "@atlaskit/avatar": "^21.1.1", - "@atlaskit/banner": "^11.6.1", - "@atlaskit/breadcrumbs": "^11.7.3", - "@atlaskit/button": "^16.3.5", - "@atlaskit/checkbox": "^12.3.18", - "@atlaskit/comment": "^10.5.2", - "@atlaskit/css-reset": "^6.3.13", - "@atlaskit/dropdown-menu": "^11.3.0", - "@atlaskit/flag": "^14.6.3", - "@atlaskit/form": "^8.5.6", - "@atlaskit/inline-message": "^11.3.0", - "@atlaskit/menu": "^1.3.8", - "@atlaskit/modal-dialog": "^12.2.14", - "@atlaskit/page-header": "^10.2.3", - "@atlaskit/page-layout": "^1.2.7", - "@atlaskit/progress-bar": "^0.5.8", - "@atlaskit/section-message": "^6.1.14", - "@atlaskit/select": "^15.7.5", - "@atlaskit/spinner": "^15.1.14", - "@atlaskit/textarea": "^4.3.8", - "@atlaskit/textfield": "^5.1.12", - "@atlaskit/tree": "^8.6.1", - "@atlaskit/user-picker": "^9.3.1", - "@blocknote/core": "^0.1.0", - "@deck.gl/aggregation-layers": "^8.6.4", - "@deck.gl/core": "^8.6.4", - "@deck.gl/layers": "^8.6.4", - "@deck.gl/react": "^8.6.4", - "@emotion/react": "^11.4.0", - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "@loaders.gl/core": "^3.0.12", - "@loaders.gl/images": "^3.0.12", - "@matrix-org/olm": "3.2.12", - "@playwright/test": "^1.18.1", - "@svgr/webpack": "^5.5.0", - "@syncedstore/yjs-reactive-bindings": "^0.4.0", - "@tippyjs/react": "^4.2.5", - "@tiptap/extension-collaboration": "^2.0.0-beta.38", - "@tiptap/extension-collaboration-cursor": "^2.0.0-beta.37", - "@typecell-org/common": "^0.0.3", - "@typecell-org/engine": "^0.0.3", - "@typecell-org/parsers": "^0.0.3", - "@types/lodash": "^4.14.168", - "@types/lowlight": "0.0.2", - "@types/markdown-it": "^10.0.3", - "@types/node": "^16.0.0", - "@types/prettier": "^2.6.4", - "@types/qs": "^6.9.7", - "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9", - "@types/semver": "^7.3.8", - "@types/speakingurl": "^13.0.2", - "@types/ua-parser-js": "^0.7.36", - "@types/uuid": "^8.3.0", - "@types/zxcvbn": "^4.4.1", - "@typescript/vfs": "^1.3.4", - "@vitejs/plugin-react": "^2.0.0", - "classnames": "^2.3.1", - "connect-history-api-fallback": "^2.0.0", - "cross-env": "^7.0.3", - "eslint": "^8.21.0", - "eslint-config-react-app": "^7.0.1", - "events": "^3.3.0", - "fake-indexeddb": "^3.1.2", - "filebridge-client": "^0.1.5", - "fractional-indexing": "^2.0.0", - "frontend-collective-react-dnd-scrollzone": "1.0.2", - "glob": "^7.2.0", - "jsdom": "^20.0.0", - "lodash": "^4.17.21", - "lowlight": "^1.20.0", - "lz-string": "^1.4.4", - "markdown-it": "^12.0.2", - "matrix-crdt": "^0.2.0", - "matrix-js-sdk": "^19.4.0", - "mobx": "^6.2.0", - "mobx-react-lite": "^3.2.0", - "monaco-editor": "^0.35.0", - "penpal": "^6.1.0", - "prettier": "2.4.1", - "probe.gl": "^3.1.4", - "qs": "^6.10.1", - "react": "^18.2.0", - "react-avatar": "^3.10.0", - "react-dnd": "^14.0.2", - "react-dnd-html5-backend": "^14.0.0", - "react-dom": "^18.2.0", - "react-error-overlay": "^6.0.9", - "react-github-btn": "^1.2.1", - "react-icons": "^4.6.0", - "react-inspector": "^6.0.1", - "react-intl-next": "npm:react-intl@^5.18.1", - "react-router-dom": "6.2.2", - "remixicon-react": "^1.0.0", - "rimraf": "^3.0.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "rollup-plugin-polyfill-node": "^0.10.2", - "semver": "^7.3.5", - "simple-peer": "^9.11.1", - "speakingurl": "^14.0.1", - "string.prototype.replaceall": "^1.0.5", - "styled-components": "3.2.6", - "tippy.js": "^6.3.1", - "typescript": "4.5.5", - "ua-parser-js": "^0.7.28", - "uuid": "^8.3.2", - "vite": "^3.0.0", - "vitest": "^0.24.4", - "vscode-lib": "^0.1.2", - "wasm-loader": "^1.3.0", - "web-vitals": "^1.0.1", - "y-indexeddb": "9.0.6", - "y-monaco": "^0.1.3", - "y-protocols": "^1.0.5", - "y-webrtc": "^10.1.8", - "yjs": "^13.5.41", - "zxcvbn": "^4.4.2" - }, - "dependencies": { - "dnd-core": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.1.tgz", - "integrity": "sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==", - "requires": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "react-dnd": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-14.0.5.tgz", - "integrity": "sha512-9i1jSgbyVw0ELlEVt/NkCUkxy1hmhJOkePoCH713u75vzHGyXhPDm28oLfc2NMSBjZRM1Y+wRjHXJT3sPrTy+A==", - "requires": { - "@react-dnd/invariant": "^2.0.0", - "@react-dnd/shallowequal": "^2.0.0", - "dnd-core": "14.0.1", - "fast-deep-equal": "^3.1.3", - "hoist-non-react-statics": "^3.3.2" - } - }, - "react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "requires": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - } - }, - "scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" - } - } - }, - "@typecell-org/engine": { - "version": "file:packages/engine", - "requires": { - "@playwright/test": "^1.18.1", - "@types/chai": "^4.3.0", - "@types/lodash": "^4.14.182", - "@types/mocha": "^9.1.0", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "chai": "^4.3.6", - "es-module-shims": "1.4.3", - "jsdom": "^20.0.0", - "lodash": "^4.17.21", - "mobx": "^6.2.0", - "mocha": "^9.2.1", - "playwright-test": "^8.1.1", - "react": "^18.2.0", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "vitest": "^0.24.4", - "vscode-lib": "^0.1.2" - }, - "dependencies": { - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - } - } - }, - "@typecell-org/packager": { - "version": "file:packages/packager", - "requires": { - "@playwright/test": "^1.18.1", - "@typecell-org/common": "*", - "@typecell-org/engine": "*", - "@typecell-org/parsers": "*", - "@types/chai": "^4.3.0", - "@types/fs-extra": "9.0.13", - "@types/lodash": "^4.14.182", - "@types/mocha": "^9.1.0", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "chai": "^4.3.6", - "es-module-shims": "1.4.3", - "fast-glob": "^3.2.12", - "jsdom": "^20.0.0", - "lodash": "^4.17.21", - "mobx": "^6.2.0", - "mocha": "^9.2.1", - "playwright-test": "^8.1.1", - "react": "^18.2.0", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "vitest": "^0.24.4", - "vscode-lib": "^0.1.2" - }, - "dependencies": { - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "requires": { - "loose-envify": "^1.1.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - } - } - }, - "@typecell-org/parsers": { - "version": "file:packages/parsers", - "requires": { - "@playwright/test": "^1.18.1", - "@typecell-org/common": "*", - "@typecell-org/engine": "*", - "@types/fs-extra": "9.0.13", - "@types/react": "^18.0.25", - "@vitest/coverage-c8": "^0.24.4", - "fast-glob": "^3.2.12", - "fs-extra": "^10.1.0", - "jsdom": "^20.0.0", - "playwright-test": "^8.1.1", - "remark-parse": "^10.0.1", - "remark-stringify": "^10.0.2", - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "unified": "^10.0.1", - "vitest": "^0.24.4", - "vscode-lib": "^0.1.2" - }, - "dependencies": { - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true - } - } - }, - "@types/chai": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.3.tgz", - "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", - "dev": true - }, - "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", - "requires": { - "@types/ms": "*" - } - }, - "@types/eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-hqzmggoxkOubpgTdcOltkfc5N8IftRJqU70d1jbOISjjZVPvjcr+CLi2CI70hx1SUIRkLgpglTy9w28nGe2Hsw==", - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==" - }, - "@types/flatbuffers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@types/flatbuffers/-/flatbuffers-1.10.0.tgz", - "integrity": "sha512-7btbphLrKvo5yl/5CC2OCxUSMx1wV1wvGT1qDXkSt7yi00/YW7E8k6qzXqJHsp+WU0eoG7r6MTQQXI9lIvd0qA==" - }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/geojson": { - "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==" - }, - "@types/hammerjs": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz", - "integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==" - }, - "@types/highlight.js": { - "version": "9.12.4", - "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", - "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", - "dev": true - }, - "@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "requires": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/linkify-it": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz", - "integrity": "sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.184", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.184.tgz", - "integrity": "sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==", - "dev": true - }, - "@types/lowlight": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@types/lowlight/-/lowlight-0.0.2.tgz", - "integrity": "sha512-37DldsUs2l4rXI2YQgVn+NKVEaaUbBIzJg3eYzAXimGrtre8vxqE65wAGqYs9W6IsoOfgj74se/rBc9yoRXOHQ==", - "dev": true - }, - "@types/markdown-it": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.3.tgz", - "integrity": "sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw==", - "dev": true, - "requires": { - "@types/highlight.js": "^9.7.0", - "@types/linkify-it": "*", - "@types/mdurl": "*", - "highlight.js": "^9.7.0" - } - }, - "@types/mdast": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", - "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", - "requires": { - "@types/unist": "*" - } - }, - "@types/mdurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz", - "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "@types/ms": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" - }, - "@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", - "devOptional": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true - }, - "@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==" - }, - "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "@types/prettier": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.0.tgz", - "integrity": "sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==", - "dev": true - }, - "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" - }, - "@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", - "dev": true - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true - }, - "@types/react": { - "version": "18.0.25", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.25.tgz", - "integrity": "sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==", - "requires": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - } - } - }, - "@types/react-dom": { - "version": "18.0.9", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.9.tgz", - "integrity": "sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==", - "requires": { - "@types/react": "^18.0.25" - } - }, - "@types/react-redux": { - "version": "7.1.24", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.24.tgz", - "integrity": "sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==", - "requires": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "@types/react-select": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@types/react-select/-/react-select-4.0.18.tgz", - "integrity": "sha512-uCPRMPshd96BwHuT7oCrFduiv5d6km3VwmtW7rVl9g4XetS3VoJ9nZo540LiwtQgaFcW96POwaxQDZDAyYaepg==", - "requires": { - "@emotion/serialize": "^1.0.0", - "@types/react": "*", - "@types/react-dom": "*", - "@types/react-transition-group": "*" - }, - "dependencies": { - "@emotion/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-F1ZZZW51T/fx+wKbVlwsfchr5q97iW8brAnXmsskz4d0hVB4O3M/SiA3SaeH06x02lSNzkkQv+n3AX3kCXKSFA==", - "requires": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", - "csstype": "^3.0.2" - } - }, - "@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" - }, - "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" - }, - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - } - } - }, - "@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", - "requires": { - "@types/react": "*" - } - }, - "@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, - "@types/semver": { - "version": "7.3.12", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz", - "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==", - "dev": true - }, - "@types/speakingurl": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@types/speakingurl/-/speakingurl-13.0.3.tgz", - "integrity": "sha512-nBHZAaNTEw1YG3ROL7HtTp7HjW8HD7DuFYbWoonUKTZHj7eyOt4vPzyMcc3+xgWNv7xi2rziaiBXHIq6wBeyrw==", - "dev": true - }, - "@types/text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-AQ6zewa0ucLJvtUi5HsErbOFKAcQfRLt9zFLlUOvcXBy2G36a+ZDpCHSGdzJVUD8aNURtIjh9aSjCStNMRCcRQ==" - }, - "@types/ua-parser-js": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", - "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", - "dev": true - }, - "@types/unist": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", - "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "@types/zxcvbn": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@types/zxcvbn/-/zxcvbn-4.4.1.tgz", - "integrity": "sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.36.1.tgz", - "integrity": "sha512-iC40UK8q1tMepSDwiLbTbMXKDxzNy+4TfPWgIL661Ym0sD42vRcQU93IsZIrmi+x292DBr60UI/gSwfdVYexCA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/type-utils": "5.36.1", - "@typescript-eslint/utils": "5.36.1", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/experimental-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.36.1.tgz", - "integrity": "sha512-zLbD16KK1P0tjYXHRKWUcEjJIGDMhbrvjTJyWTfKRLB9NXW45S1zWw4+GZfxEdGzIPyaw22DUgUtyGgr3d7jAg==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.36.1" - } - }, - "@typescript-eslint/parser": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.36.1.tgz", - "integrity": "sha512-/IsgNGOkBi7CuDfUbwt1eOqUXF9WGVBW9dwEe1pi+L32XrTsZIgmDFIi2RxjzsvB/8i+MIf5JIoTEH8LOZ368A==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.36.1.tgz", - "integrity": "sha512-pGC2SH3/tXdu9IH3ItoqciD3f3RRGCh7hb9zPdN2Drsr341zgd6VbhP5OHQO/reUqihNltfPpMpTNihFMarP2w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.36.1.tgz", - "integrity": "sha512-xfZhfmoQT6m3lmlqDvDzv9TiCYdw22cdj06xY0obSznBsT///GK5IEZQdGliXpAOaRL34o8phEvXzEo/VJx13Q==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.36.1", - "@typescript-eslint/utils": "5.36.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.36.1.tgz", - "integrity": "sha512-jd93ShpsIk1KgBTx9E+hCSEuLCUFwi9V/urhjOWnOaksGZFbTOxAT47OH2d4NLJnLhkVD+wDbB48BuaycZPLBg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.36.1.tgz", - "integrity": "sha512-ih7V52zvHdiX6WcPjsOdmADhYMDN15SylWRZrT2OMy80wzKbc79n8wFW0xpWpU0x3VpBz/oDgTm2xwDAnFTl+g==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/visitor-keys": "5.36.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.36.1.tgz", - "integrity": "sha512-lNj4FtTiXm5c+u0pUehozaUWhh7UYKnwryku0nxJlYUEWetyG92uw2pr+2Iy4M/u0ONMKzfrx7AsGBTCzORmIg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.36.1", - "@typescript-eslint/types": "5.36.1", - "@typescript-eslint/typescript-estree": "5.36.1", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.36.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.36.1.tgz", - "integrity": "sha512-ojB9aRyRFzVMN3b5joSYni6FAS10BBSCAfKJhjJAV08t/a95aM6tAhz+O1jF+EtgxktuSO3wJysp2R+Def/IWQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.36.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@typescript/vfs": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.3.5.tgz", - "integrity": "sha512-pI8Saqjupf9MfLw7w2+og+fmb0fZS0J6vsKXXrp4/PDXEFvntgzXmChCXC/KefZZS0YGS6AT8e0hGAJcTsdJlg==", - "requires": { - "debug": "^4.1.1" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@vitejs/plugin-react": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.0.1.tgz", - "integrity": "sha512-uINzNHmjrbunlFtyVkST6lY1ewSfz/XwLufG0PIqvLGnpk2nOIOa/1CACTDNcKi1/RwaCzJLmsXwm1NsUVV/NA==", - "dev": true, - "requires": { - "@babel/core": "^7.18.10", - "@babel/plugin-transform-react-jsx": "^7.18.10", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", - "@babel/plugin-transform-react-jsx-source": "^7.18.6", - "magic-string": "^0.26.2", - "react-refresh": "^0.14.0" - } - }, - "@vitest/coverage-c8": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.24.4.tgz", - "integrity": "sha512-1mhYQip6IJw1p9hzM+sH8O/RbILMe7FwScWI7COoMGAThdDRytDjmOal38F/EVrIPZY3nZ5hf7S7JFGjbb4bTg==", - "dev": true, - "requires": { - "c8": "^7.12.0", - "vitest": "0.24.4" - } - }, - "@yarnpkg/lockfile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", - "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", - "dev": true - }, - "abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "another-json": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/another-json/-/another-json-0.2.0.tgz", - "integrity": "sha512-/Ndrl68UQLhnCdsAzEXLMFuOR546o2qbYRqCglaNHbjXrwG1ayTcdwr3zkSGOGtGXDyR5X9nCFfnyG2AFJIsqg==" - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "apache-arrow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/apache-arrow/-/apache-arrow-4.0.1.tgz", - "integrity": "sha512-DyF7GXCbSjsw4P5C8b+qW7OnJKa6w9mJI0mhV0+EfZbVZCmhfiF6ffqcnrI/kzBrRqn9hH/Ft9n5+m4DTbBJpg==", - "requires": { - "@types/flatbuffers": "^1.10.0", - "@types/node": "^14.14.37", - "@types/text-encoding-utf-8": "^1.0.1", - "command-line-args": "5.1.1", - "command-line-usage": "6.1.1", - "flatbuffers": "1.12.0", - "json-bignum": "^0.0.3", - "pad-left": "^2.1.0", - "text-encoding-utf-8": "^1.0.2", - "tslib": "^2.2.0" - }, - "dependencies": { - "@types/node": { - "version": "14.18.26", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.26.tgz", - "integrity": "sha512-0b+utRBSYj8L7XAp0d+DX7lI4cSmowNaaTkk6/1SKzbKkG+doLuPusB9EOvzLJ8ahJSk03bTLIL6cWaEd4dBKA==" - } - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" - }, - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.every": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.3.tgz", - "integrity": "sha512-vWnriJI//SOMOWtXbU/VXhJ/InfnNHPF6BLKn5WfY8xXy+NWql0fUy20GO3sdqBhCAO+qw8S/E5nJiZX+QFdCA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "is-string": "^1.0.7" - } - }, - "array.prototype.flat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", - "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz", - "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.reduce": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz", - "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.2", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "axe-core": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", - "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "babel-plugin-dynamic-import-node": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", - "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, - "requires": { - "object.assign": "^4.1.0" - } - }, - "babel-plugin-emotion": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz", - "integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==", - "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@emotion/hash": "0.8.0", - "@emotion/memoize": "0.7.4", - "@emotion/serialize": "^0.11.16", - "babel-plugin-macros": "^2.0.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^1.0.5", - "find-root": "^1.1.0", - "source-map": "^0.5.7" - }, - "dependencies": { - "@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" - }, - "@emotion/memoize": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", - "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==" - }, - "babel-plugin-macros": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", - "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", - "requires": { - "@babel/runtime": "^7.7.2", - "cosmiconfig": "^6.0.0", - "resolve": "^1.12.0" - } - }, - "cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" - } - } - }, - "babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "requires": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz", - "integrity": "sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.2", - "semver": "^6.1.1" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz", - "integrity": "sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2" - } - }, - "babel-plugin-styled-components": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.0.7.tgz", - "integrity": "sha512-i7YhvPgVqRKfoQ66toiZ06jPNA3p6ierpfUuEWxNF+fV27Uv5gxBkf8KZLHUCc1nFA9j6+80pYoIpqCeyW3/bA==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "babel-plugin-syntax-jsx": "^6.18.0", - "lodash": "^4.17.11", - "picomatch": "^2.3.0" - } - }, - "babel-plugin-syntax-jsx": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" - }, - "babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", - "dev": true - }, - "babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dev": true, - "requires": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "babylon": { - "version": "7.0.0-beta.47", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.47.tgz", - "integrity": "sha512-+rq2cr4GDhtToEzKFD6KZZMDBXhjFAr9JjPw9pAppZACeEWqNM294j+NdBzkSHYXwzzBmVjZ3nEVJlOhbR2gOQ==" - }, - "bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base-x": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", - "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" - }, - "base64-arraybuffer-es6": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/base64-arraybuffer-es6/-/base64-arraybuffer-es6-0.7.0.tgz", - "integrity": "sha512-ESyU/U1CFZDJUdr+neHRhNozeCv72Y7Vm0m1DCbjX3KBjT6eYocvAJlSk6+8+HkVwXlT1FNxhGW6q3UKAlCvvw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "before-after-hook": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz", - "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==", - "dev": true - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" - }, - "bin-links": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-3.0.1.tgz", - "integrity": "sha512-9vx+ypzVhASvHTS6K+YSGf7nwQdANoz7v6MTC0aCtYnOEZ87YvMf81aY737EZnGZdpbRM3sfWjO9oWkKmuIvyQ==", - "dev": true, - "requires": { - "cmd-shim": "^5.0.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^3.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^4.0.0" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bind-event-listener": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-2.1.1.tgz", - "integrity": "sha512-O+a5c0D2se/u2VlBJmPRn45IB6R4mYMh1ok3dWxrIZ2pmLqzggBhb875mbq73508ylzofc0+hT9W41x4Y2s8lg==" - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", - "dev": true - }, - "browser-request": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/browser-request/-/browser-request-0.3.3.tgz", - "integrity": "sha512-YyNI4qJJ+piQG6MMEuo7J3Bzaqssufx04zpEKYfSrl/1Op59HWali9zMtBpXnkmqMcOuWJPZvudrm9wISmnCbg==" - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", - "requires": { - "base-x": "^4.0.0" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, - "byte-size": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz", - "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", - "dev": true - }, - "c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "dependencies": { - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } - } - }, - "cacache": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.1.tgz", - "integrity": "sha512-VDKN+LHyCQXaaYZ7rA/qtkURU+/yYhviUdvqEv2LT6QPZU8jpyzEkEVAcKlKLt5dJ5BRp11ym8lo3NKLluEPLg==", - "dev": true, - "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^1.1.1" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "camelize": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", - "integrity": "sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg==" - }, - "caniuse-lite": { - "version": "1.0.30001388", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", - "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==" - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chromatism": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/chromatism/-/chromatism-2.6.0.tgz", - "integrity": "sha512-ZgkGBXc0b0X7KW26aHIuwQvg6MFt47ehRg+YqcmLtGtHPmn6+5sx9uAFTLHcmsg9kYjOcFJYc/U2n06wrZ7KTA==" - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "cmd-shim": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", - "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "coa": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", - "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", - "dev": true, - "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", - "dev": true, - "requires": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-line-args": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz", - "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==", - "requires": { - "array-back": "^3.0.1", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.1.tgz", - "integrity": "sha512-F59pEuAR9o1SF/bD0dQBDluhpT4jJQNWUHEuVBqpDmCUo6gPjCi+m9fCWnWZVR/oG6cMTUms4h+3NPl74wGXvA==", - "requires": { - "array-back": "^4.0.1", - "chalk": "^2.4.2", - "table-layout": "^1.0.1", - "typical": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" - } - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - }, - "dependencies": { - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - } - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "requires": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - } - }, - "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "requires": { - "safe-buffer": "~5.1.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "core-js": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", - "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==" - }, - "core-js-compat": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.0.tgz", - "integrity": "sha512-extKQM0g8/3GjFx9US12FAgx8KJawB7RCQ5y8ipYLbmfzEzmFRWdDjIlxDx82g7ygcNG85qMVUSRyABouELdow==", - "dev": true, - "requires": { - "browserslist": "^4.21.3", - "semver": "7.0.0" - }, - "dependencies": { - "semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true - } - } - }, - "core-js-pure": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.25.0.tgz", - "integrity": "sha512-IeHpLwk3uoci37yoI2Laty59+YqH9x5uR65/yiA0ARAJrTrN4YU0rmauLWfvqOuk77SlNJXj2rM6oT/dBD87+A==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "cp-file": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz", - "integrity": "sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "nested-error-stacks": "^2.0.0", - "p-event": "^4.1.0" - } - }, - "cpy": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cpy/-/cpy-9.0.1.tgz", - "integrity": "sha512-D9U0DR5FjTCN3oMTcFGktanHnAG5l020yvOCR1zKILmAyPP7I/9pl6NFgRbDcmSENtbK1sQLBz1p9HIOlroiNg==", - "dev": true, - "requires": { - "arrify": "^3.0.0", - "cp-file": "^9.1.0", - "globby": "^13.1.1", - "junk": "^4.0.0", - "micromatch": "^4.0.4", - "nested-error-stacks": "^2.1.0", - "p-filter": "^3.0.0", - "p-map": "^5.3.0" - }, - "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "arrify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", - "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", - "dev": true - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "requires": { - "aggregate-error": "^4.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "requires": { - "node-fetch": "2.6.7" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" - }, - "crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "requires": { - "type-fest": "^1.0.1" - }, - "dependencies": { - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true - } - } - }, - "css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "requires": { - "tiny-invariant": "^1.0.6" - } - }, - "css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" - }, - "css-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", - "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^3.2.1", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" - } - }, - "css-select-base-adapter": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", - "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", - "dev": true - }, - "css-to-react-native": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-2.3.2.tgz", - "integrity": "sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw==", - "requires": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^3.3.0" - } - }, - "css-tree": { - "version": "1.0.0-alpha.37", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", - "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", - "dev": true, - "requires": { - "mdn-data": "2.0.4", - "source-map": "^0.6.1" - } - }, - "css-what": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", - "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", - "dev": true - }, - "csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, - "requires": { - "css-tree": "^1.1.2" - }, - "dependencies": { - "css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, - "requires": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - } - }, - "mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true - } - } - }, - "cssom": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", - "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", - "dev": true - }, - "cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dev": true, - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - } - } - }, - "csstype": { - "version": "2.6.20", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz", - "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==" - }, - "d3-hexbin": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", - "integrity": "sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==" - }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "data-urls": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", - "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decimal.js": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.0.tgz", - "integrity": "sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==", - "dev": true - }, - "decode-named-character-reference": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", - "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", - "requires": { - "character-entities": "^2.0.0" - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.5.tgz", - "integrity": "sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "es-get-iterator": "^1.1.1", - "get-intrinsic": "^1.0.1", - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.2", - "is-regex": "^1.1.1", - "isarray": "^2.0.5", - "object-is": "^1.1.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "regexp.prototype.flags": "^1.3.0", - "side-channel": "^1.0.3", - "which-boxed-primitive": "^1.0.1", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.2" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "deprecation": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", - "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", - "dev": true - }, - "dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" - }, - "dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dnd-core": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.7.0.tgz", - "integrity": "sha512-+YqwflWEY1MEAEl2QiEiRaglYkCwIZryyQwximQGuTOm/ns7fS6Lg/i7OCkrtjM10D5FhArf/VUHIL4ZaRBK0g==", - "peer": true, - "requires": { - "asap": "^2.0.6", - "invariant": "^2.2.4", - "redux": "^4.0.1" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "requires": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - }, - "dependencies": { - "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" - } - } - }, - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", - "dev": true - }, - "domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", - "dev": true, - "requires": { - "webidl-conversions": "^7.0.0" - }, - "dependencies": { - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - } - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "dev": true - }, - "dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "electron-to-chromium": { - "version": "1.4.240", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", - "integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.2.tgz", - "integrity": "sha512-XxXQuVNrySBNlEkTYJoDNFe5+s2yIOpzq80sUHEdPdQr0S5nTLz4ZPPPswNIpKseDDUS5yghX1gfLIHQZ1iNuQ==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.2", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-get-iterator": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz", - "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.0", - "has-symbols": "^1.0.1", - "is-arguments": "^1.1.0", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.5", - "isarray": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, - "es-module-shims": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.4.3.tgz", - "integrity": "sha512-qMUb+8lrpqZ6jW/kelQU7XD1hR71hmxKhIDmmVwsQNQaAYh0fzErnKSj9Xi80L0ubEjnzCDD5ha7oZehkwFApg==" - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.6.tgz", - "integrity": "sha512-sgLOv3l4xklvXzzczhRwKRotyrfyZ2i1fCS6PTOLPd9wevDPArGU8HFtHrHCOcsMwTjLjzGm15gvC8uxVzQf+w==", - "dev": true, - "peer": true, - "requires": { - "@esbuild/linux-loong64": "0.15.6", - "esbuild-android-64": "0.15.6", - "esbuild-android-arm64": "0.15.6", - "esbuild-darwin-64": "0.15.6", - "esbuild-darwin-arm64": "0.15.6", - "esbuild-freebsd-64": "0.15.6", - "esbuild-freebsd-arm64": "0.15.6", - "esbuild-linux-32": "0.15.6", - "esbuild-linux-64": "0.15.6", - "esbuild-linux-arm": "0.15.6", - "esbuild-linux-arm64": "0.15.6", - "esbuild-linux-mips64le": "0.15.6", - "esbuild-linux-ppc64le": "0.15.6", - "esbuild-linux-riscv64": "0.15.6", - "esbuild-linux-s390x": "0.15.6", - "esbuild-netbsd-64": "0.15.6", - "esbuild-openbsd-64": "0.15.6", - "esbuild-sunos-64": "0.15.6", - "esbuild-windows-32": "0.15.6", - "esbuild-windows-64": "0.15.6", - "esbuild-windows-arm64": "0.15.6" - } - }, - "esbuild-android-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.6.tgz", - "integrity": "sha512-Z1CHSgB1crVQi2LKSBwSkpaGtaloVz0ZIYcRMsvHc3uSXcR/x5/bv9wcZspvH/25lIGTaViosciS/NS09ERmVA==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-android-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.6.tgz", - "integrity": "sha512-mvM+gqNxqKm2pCa3dnjdRzl7gIowuc4ga7P7c3yHzs58Im8v/Lfk1ixSgQ2USgIywT48QWaACRa3F4MG7djpSw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-darwin-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.6.tgz", - "integrity": "sha512-BsfVt3usScAfGlXJiGtGamwVEOTM8AiYiw1zqDWhGv6BncLXCnTg1As+90mxWewdTZKq3iIy8s9g8CKkrrAXVw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.6.tgz", - "integrity": "sha512-CnrAeJaEpPakUobhqO4wVSA4Zm6TPaI5UY4EsI62j9mTrjIyQPXA1n4Ju6Iu5TVZRnEqV6q8blodgYJ6CJuwCA==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-freebsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.6.tgz", - "integrity": "sha512-+qFdmqi+jkAsxsNJkaWVrnxEUUI50nu6c3MBVarv3RCDCbz7ZS1a4ZrdkwEYFnKcVWu6UUE0Kkb1SQ1yGEG6sg==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.6.tgz", - "integrity": "sha512-KtQkQOhnNciXm2yrTYZMD3MOm2zBiiwFSU+dkwNbcfDumzzUprr1x70ClTdGuZwieBS1BM/k0KajRQX7r504Xw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-32": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.6.tgz", - "integrity": "sha512-IAkDNz3TpxwISTGVdQijwyHBZrbFgLlRi5YXcvaEHtgbmayLSDcJmH5nV1MFgo/x2QdKcHBkOYHdjhKxUAcPwg==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.6.tgz", - "integrity": "sha512-gQPksyrEYfA4LJwyfTQWAZaVZCx4wpaLrSzo2+Xc9QLC+i/sMWmX31jBjrn4nLJCd79KvwCinto36QC7BEIU/A==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-arm": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.6.tgz", - "integrity": "sha512-xZ0Bq2aivsthDjA/ytQZzxrxIZbG0ATJYMJxNeOIBc1zUjpbVpzBKgllOZMsTSXMHFHGrow6TnCcgwqY0+oEoQ==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.6.tgz", - "integrity": "sha512-aovDkclFa6C9EdZVBuOXxqZx83fuoq8097xZKhEPSygwuy4Lxs8J4anHG7kojAsR+31lfUuxzOo2tHxv7EiNHA==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.6.tgz", - "integrity": "sha512-wVpW8wkWOGizsCqCwOR/G3SHwhaecpGy3fic9BF1r7vq4djLjUcA8KunDaBCjJ6TgLQFhJ98RjDuyEf8AGjAvw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.6.tgz", - "integrity": "sha512-z6w6gsPH/Y77uchocluDC8tkCg9rfkcPTePzZKNr879bF4tu7j9t255wuNOCE396IYEGxY7y8u2HJ9i7kjCLVw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.6.tgz", - "integrity": "sha512-pfK/3MJcmbfU399TnXW5RTPS1S+ID6ra+CVj9TFZ2s0q9Ja1F5A1VirUUvViPkjiw+Kq3zveyn6U09Wg1zJXrw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-linux-s390x": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.6.tgz", - "integrity": "sha512-OZeeDu32liefcwAE63FhVqM4heWTC8E3MglOC7SK0KYocDdY/6jyApw0UDkDHlcEK9mW6alX/SH9r3PDjcCo/Q==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-netbsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.6.tgz", - "integrity": "sha512-kaxw61wcHMyiEsSsi5ut1YYs/hvTC2QkxJwyRvC2Cnsz3lfMLEu8zAjpBKWh9aU/N0O/gsRap4wTur5GRuSvBA==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-openbsd-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.6.tgz", - "integrity": "sha512-CuoY60alzYfIZapUHqFXqXbj88bbRJu8Fp9okCSHRX2zWIcGz4BXAHXiG7dlCye5nFVrY72psesLuWdusyf2qw==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-sunos-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.6.tgz", - "integrity": "sha512-1ceefLdPWcd1nW/ZLruPEYxeUEAVX0YHbG7w+BB4aYgfknaLGotI/ZvPWUZpzhC8l1EybrVlz++lm3E6ODIJOg==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-windows-32": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.6.tgz", - "integrity": "sha512-pBqdOsKqCD5LRYiwF29PJRDJZi7/Wgkz46u3d17MRFmrLFcAZDke3nbdDa1c8YgY78RiemudfCeAemN8EBlIpA==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-windows-64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.6.tgz", - "integrity": "sha512-KpPOh4aTOo//g9Pk2oVAzXMpc9Sz9n5A9sZTmWqDSXCiiachfFhbuFlsKBGATYCVitXfmBIJ4nNYYWSOdz4hQg==", - "dev": true, - "optional": true, - "peer": true - }, - "esbuild-windows-arm64": { - "version": "0.15.6", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.6.tgz", - "integrity": "sha512-DB3G2x9OvFEa00jV+OkDBYpufq5x/K7a6VW6E2iM896DG4ZnAvJKQksOsCPiM1DUaa+DrijXAQ/ZOcKAqf/3Hg==", - "dev": true, - "optional": true, - "peer": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", - "dev": true, - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - } - } - }, - "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dev": true, - "requires": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - } - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "^5.0.0" - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", - "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.9", - "aria-query": "^4.2.2", - "array-includes": "^3.1.5", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.4.3", - "axobject-query": "^2.2.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.2", - "language-tags": "^1.0.5", - "minimatch": "^3.1.2", - "semver": "^6.3.0" - }, - "dependencies": { - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react": { - "version": "7.31.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.1.tgz", - "integrity": "sha512-j4/2xWqt/R7AZzG8CakGHA6Xa/u7iR8Q3xCxY+AUghdT92bnIDOBEefV456OeH0QvBcroVc0eyvrrLSyQGYIfg==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "array.prototype.flatmap": "^1.3.0", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.5", - "object.fromentries": "^2.0.5", - "object.hasown": "^1.1.1", - "object.values": "^1.1.5", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.3", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.7" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "requires": {} - }, - "eslint-plugin-testing-library": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.6.0.tgz", - "integrity": "sha512-y63TRzPhGCMNsnUwMGJU1MFWc/3GvYw+nzobp9QiyNTTKsgAt5RKAOT1I34+XqVBpX1lC8bScoOjCkP7iRv0Mw==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "^5.13.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" - }, - "fake-indexeddb": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fake-indexeddb/-/fake-indexeddb-3.1.8.tgz", - "integrity": "sha512-7umIgcdnDfNcjw0ZaoD6yR2BflngKmPsyzZC+sV2fdttwz5bH6B6CCaNzzD+MURfRg8pvr/aL0trfNx65FLiDg==", - "dev": true, - "requires": { - "realistic-structured-clone": "^2.0.1" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "requires": { - "format": "^0.2.0" - } - }, - "fbjs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz", - "integrity": "sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==", - "requires": { - "cross-fetch": "^3.1.5", - "fbjs-css-vars": "^1.0.0", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "fbjs-css-vars": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", - "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "filebridge-client": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/filebridge-client/-/filebridge-client-0.1.5.tgz", - "integrity": "sha512-M+RUw+7mufI8IQ+cgiWAmXYmm4kGdABLKHdVgdv0gkNwCc3SNzqbY7d91NMemN9jeCZa0+xLzH/tEfuzEQo65A==", - "requires": { - "vscode-lib": "^0.1.2" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "final-form": { - "version": "4.20.7", - "resolved": "https://registry.npmjs.org/final-form/-/final-form-4.20.7.tgz", - "integrity": "sha512-ii3X9wNfyBYFnDPunYN5jh1/HAvtOZ9aJI/TVk0MB86hZuOeYkb+W5L3icgwW9WWNztZR6MDU3En6eoZTUoFPg==", - "requires": { - "@babel/runtime": "^7.10.0" - } - }, - "final-form-focus": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/final-form-focus/-/final-form-focus-1.1.2.tgz", - "integrity": "sha512-Gd+Bd2Ll7ijo3/sd6kJ/bwLkhc2bUJPxTON6fIqee/008EJpACWhT+zoWCm9q6NcfMcWRS+Sp5ikRX8iqdXeGQ==", - "requires": {} - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "requires": { - "array-back": "^3.0.1" - } - }, - "find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "requires": { - "micromatch": "^4.0.2" - } - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatbuffers": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==" - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "focus-lock": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.2.tgz", - "integrity": "sha512-pZ2bO++NWLHhiKkgP1bEXHhR1/OjVcSvlCJ98aNJDFeb7H5OOQaO+SKOZle6041O9rv2tmbrO4JzClAvDUHf0g==", - "requires": { - "tslib": "^2.0.3" - } - }, - "focus-trap": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-2.4.6.tgz", - "integrity": "sha512-vWZTPtBU6pBoyWZDRZJHkXsyP2ZCZBHE3DRVXnSVdQKH/mcDtu9S5Kz8CUDyIqpfZfLEyI9rjKJLnc4Y40BRBg==", - "requires": { - "tabbable": "^1.0.3" - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" - }, - "fractional-indexing": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-2.1.0.tgz", - "integrity": "sha512-4tIVui+5dxsXe/BG7D9EzgNIDK9fEoBzjvAf9gFfxFDPo2LsPSjfFKB2QmtcvmioD2IlshtcJFXGEcDPTG6R/A==" - }, - "frontend-collective-react-dnd-scrollzone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/frontend-collective-react-dnd-scrollzone/-/frontend-collective-react-dnd-scrollzone-1.0.2.tgz", - "integrity": "sha512-me/D9PZJq9j/sjEjs/OPmm6V6nbaHbhgeQiwrWu0t35lhwAOKWc+QBzzKKcZQeboYTkgE8UvCD9el+5ANp+g5Q==", - "requires": { - "hoist-non-react-statics": "^3.1.0", - "lodash.throttle": "^4.0.1", - "prop-types": "^15.5.9", - "raf": "^3.2.0", - "react": "^16.3.0", - "react-display-name": "^0.2.0", - "react-dom": "^16.3.0" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" - }, - "get-browser-rtc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", - "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "requires": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - } - } - }, - "git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "requires": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "git-up": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-6.0.0.tgz", - "integrity": "sha512-6RUFSNd1c/D0xtGnyWN2sxza2bZtZ/EmI9448n6rCZruFwV/ezeEn2fJP7XnUQGwf0RAtd/mmUCbtH6JPYA2SA==", - "dev": true, - "requires": { - "is-ssh": "^1.4.0", - "parse-url": "^7.0.2" - } - }, - "git-url-parse": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-12.0.0.tgz", - "integrity": "sha512-I6LMWsxV87vysX1WfsoglXsXg6GjQRKq7+Dgiseo+h0skmp5Hp2rzmcEIRQot9CPA+uzU7x1x7jZdqvTFGnB+Q==", - "dev": true, - "requires": { - "git-up": "^6.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "github-buttons": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/github-buttons/-/github-buttons-2.22.0.tgz", - "integrity": "sha512-N5bk01s1WgK1FVtoeSUVkRkJpkaSu8yHMPcjye+PTa0jsRjMRNrYqVLgpUf2RA5Kvec05DfHYAT6/68fwkdqPw==" - }, - "gl-matrix": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "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" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==" - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-dynamic-import": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", - "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "highlight.js": { - "version": "9.18.5", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", - "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", - "dev": true - }, - "history": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", - "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", - "requires": { - "@babel/runtime": "^7.7.6" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "requires": { - "react-is": "^16.7.0" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } - } - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "requires": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "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, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" - } - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "init-package-json": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", - "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", - "dev": true, - "requires": { - "npm-package-arg": "^9.0.1", - "promzard": "^0.3.0", - "read": "^1.0.7", - "read-package-json": "^5.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^4.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } - } - }, - "inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" - } - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "intl-messageformat": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-9.13.0.tgz", - "integrity": "sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/fast-memoize": "1.2.1", - "@formatjs/icu-messageformat-parser": "2.1.0", - "tslib": "^2.1.0" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-retina": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-retina/-/is-retina-1.0.3.tgz", - "integrity": "sha512-/tCmbIETZwCd8uHWO+GvbRa7jxwHFHdfetHfiwoP0aN9UDf3prUJMtKn7iBFYipYhqY1bSTjur8hC/Dakt8eyw==" - }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "is-ssh": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", - "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, - "requires": { - "protocols": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">= 0.8.0" } }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" + "node_modules/premove": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "bin": { + "premove": "bin.js" + }, + "engines": { + "node": ">=6" } }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "node_modules/pretty-format": { + "version": "29.6.2", "dev": true, - "requires": { - "text-extensions": "^1.0.0" + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "is-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", - "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } + "license": "MIT" }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/process": { + "version": "0.11.10", "dev": true, - "requires": { - "is-docker": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">= 0.6.0" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "node_modules/promise": { + "version": "7.3.1", + "license": "MIT", + "dependencies": { + "asap": "~2.0.3" + } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + "node_modules/property-information": { + "version": "6.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "isomorphic-fetch": { + "node_modules/prosemirror-changeset": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==", - "requires": { - "node-fetch": "^1.0.1", - "whatwg-fetch": ">=0.10.0" - }, + "license": "MIT", "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - } + "prosemirror-transform": "^1.0.0" } }, - "isomorphic.js": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", - "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" } }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "node_modules/prosemirror-commands": { + "version": "1.5.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "jsdom": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.0.tgz", - "integrity": "sha512-x4a6CKCgx00uCmP+QakBDFXwjAJ69IkkIWHmtmjd3wvXPcdOS44hfX2vqkOQrVrq8l9DhNNADZRXaCEWvgXtVA==", - "dev": true, - "requires": { - "abab": "^2.0.6", - "acorn": "^8.7.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.3.1", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "^7.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^3.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.8.0", - "xml-name-validator": "^4.0.0" - }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "license": "MIT", "dependencies": { - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - } + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" } }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "json-bignum": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/json-bignum/-/json-bignum-0.0.3.tgz", - "integrity": "sha512-2WHyXj3OfHSgNyuzDbSxI1w2jgw5gkWSWhS7Qg4bWXx1nLk3jnbwfUeS0PSba3IzpTUWdHxBieELUzXRjQB2zg==" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "node_modules/prosemirror-history": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + "node_modules/prosemirror-inputrules": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "node_modules/prosemirror-markdown": { + "version": "1.11.2", + "license": "MIT", + "dependencies": { + "markdown-it": "^13.0.1", + "prosemirror-model": "^1.0.0" + } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "node_modules/prosemirror-markdown/node_modules/entities": { + "version": "3.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true + "node_modules/prosemirror-markdown/node_modules/linkify-it": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/prosemirror-markdown/node_modules/markdown-it": { + "version": "13.0.1", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" } }, - "jsonc-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true + "node_modules/prosemirror-model": { + "version": "1.19.3", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "node_modules/prosemirror-schema-basic": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.19.0" } }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true + "node_modules/prosemirror-schema-list": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "node_modules/prosemirror-state": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" } }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" + "node_modules/prosemirror-tables": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" } }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "node_modules/prosemirror-trailing-node": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "@remirror/core-helpers": "^3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.19.0", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.31.2" } }, - "junk": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.0.tgz", - "integrity": "sha512-ojtSU++zLJ3jQG9bAYjg94w+/DOJtRyD7nPaerMFrBhmdVmiV5/exYH5t4uHga4G/95nT6hr1OJoKIFbYbrW5w==", - "dev": true - }, - "just-diff": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.0.3.tgz", - "integrity": "sha512-a8p80xcpJ6sdurk5PxDKb4mav9MeKjA3zFKZpCWBIfvg8mznfnmb13MKZvlrwJ+Lhis0wM3uGAzE0ArhFHvIcg==", - "dev": true - }, - "just-diff-apply": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.3.1.tgz", - "integrity": "sha512-dgFenZnMsc1xGNqgdtgnh7DK+Oy352CE3VZLbzcbQpsBs9iI2K3M0IRrdgREZ72eItTjbl0suRyvKRdVQa9GbA==", - "dev": true - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" + "node_modules/prosemirror-transform": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0" } }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" + "node_modules/prosemirror-view": { + "version": "1.31.7", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true + "node_modules/prr": { + "version": "1.0.1", + "license": "MIT", + "optional": true }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "node_modules/psl": { + "version": "1.9.0", "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } + "license": "MIT" }, - "lerna": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-5.3.0.tgz", - "integrity": "sha512-0Y9xJqleVu0ExGmsw2WM/GkVmxOwtA7OLQFS5ERPKJfnsxH9roTX3a7NPaGQRI2E+tSJLJJGgNSf3WYEqinOqA==", - "dev": true, - "requires": { - "@lerna/add": "5.3.0", - "@lerna/bootstrap": "5.3.0", - "@lerna/changed": "5.3.0", - "@lerna/clean": "5.3.0", - "@lerna/cli": "5.3.0", - "@lerna/create": "5.3.0", - "@lerna/diff": "5.3.0", - "@lerna/exec": "5.3.0", - "@lerna/import": "5.3.0", - "@lerna/info": "5.3.0", - "@lerna/init": "5.3.0", - "@lerna/link": "5.3.0", - "@lerna/list": "5.3.0", - "@lerna/publish": "5.3.0", - "@lerna/run": "5.3.0", - "@lerna/version": "5.3.0", - "import-local": "^3.0.2", - "npmlog": "^6.0.2", - "nx": ">=14.4.3 < 16" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/punycode": { + "version": "2.3.0", "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "lib0": { - "version": "0.2.52", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.52.tgz", - "integrity": "sha512-CjxlM7UgICfN6b2OPALBXchIBiNk6jE+1g7JP8ha+dh1xKRDSYpH0WQl1+rMqCju49xUnwPG34v4CR5/rPOZhg==", - "requires": { - "isomorphic.js": "^0.2.4" - } + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" }, - "libnpmaccess": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.3.tgz", - "integrity": "sha512-4tkfUZprwvih2VUZYMozL7EMKgQ5q9VW2NtRyxWtQWlkLTAWHRklcAvBN49CVqEkhUw7vTX2fNgB5LzgUucgYg==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" } - } + ], + "license": "MIT" + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "license": "MIT" }, - "libnpmpublish": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.4.tgz", - "integrity": "sha512-lvAEYW8mB8QblL6Q/PI/wMzKNvIrF7Kpujf/4fGS/32a2i3jzUXi04TNyIBcK6dQJ34IgywfaKGh+Jq4HYPFmg==", + "node_modules/randombytes": { + "version": "2.1.0", "dev": true, - "requires": { - "normalize-package-data": "^4.0.0", - "npm-package-arg": "^9.0.1", - "npm-registry-fetch": "^13.0.0", - "semver": "^7.3.7", - "ssri": "^9.0.0" - }, + "license": "MIT", "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "normalize-package-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", - "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } + "safe-buffer": "^5.1.0" } }, - "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", - "dev": true + "node_modules/react": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "node_modules/react-avatar": { + "version": "3.10.0", + "license": "MIT", + "dependencies": { + "core-js": "^3.6.1", + "is-retina": "^1.0.3", + "md5": "^2.0.0" + }, + "peerDependencies": { + "prop-types": "^15.0.0 || ^16.0.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "linkify-it": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", - "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", - "requires": { - "uc.micro": "^1.0.1" + "node_modules/react-beautiful-dnd-next": { + "version": "11.0.5", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime-corejs2": "^7.4.5", + "css-box-model": "^1.1.2", + "memoize-one": "^5.0.4", + "raf-schd": "^4.0.0", + "react-redux": "^7.0.3", + "redux": "^4.0.1", + "tiny-invariant": "^1.0.4", + "use-memo-one": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.8.5" } }, - "linkifyjs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-3.0.5.tgz", - "integrity": "sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg==" + "node_modules/react-beautiful-dnd-next/node_modules/memoize-one": { + "version": "5.2.1", + "license": "MIT" }, - "load-json-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", - "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^5.0.0", - "strip-bom": "^4.0.0", - "type-fest": "^0.6.0" - }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "license": "MIT", "dependencies": { - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "loader-utils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", - "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, + "node_modules/react-dnd": { + "version": "14.0.5", + "license": "MIT", "dependencies": { - "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "@react-dnd/invariant": "^2.0.0", + "@react-dnd/shallowequal": "^2.0.0", + "dnd-core": "14.0.1", + "fast-deep-equal": "^3.1.3", + "hoist-non-react-statics": "^3.3.2" + }, + "peerDependencies": { + "@types/hoist-non-react-statics": ">= 3.3.1", + "@types/node": ">= 12", + "@types/react": ">= 16", + "react": ">= 16.14" + }, + "peerDependenciesMeta": { + "@types/hoist-non-react-statics": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@types/react": { + "optional": true } } }, - "local-pkg": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", - "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" + "node_modules/react-dnd-html5-backend": { + "version": "14.1.0", + "license": "MIT", + "dependencies": { + "dnd-core": "14.0.1" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" } }, - "loglevel": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", - "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==" - }, - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + "node_modules/react-error-overlay": { + "version": "6.0.11", + "license": "MIT" }, - "longest-streak": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.0.1.tgz", - "integrity": "sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==" + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "node_modules/react-focus-lock": { + "version": "2.9.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^0.11.6", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "loupe": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.4.tgz", - "integrity": "sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" + "node_modules/react-icons": { + "version": "4.10.1", + "license": "MIT", + "peerDependencies": { + "react": "*" } }, - "lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "requires": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "dependencies": { - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - } + "node_modules/react-inspector": { + "version": "6.0.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0 || ^18.0.0" } }, - "lru-cache": { - "version": "7.13.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.13.2.tgz", - "integrity": "sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA==", - "dev": true + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-loosely-lazy": { + "version": "1.1.0", + "license": "Apache-2.0", + "peerDependencies": { + "@react-loosely-lazy/manifest": "1.1.0", + "react": "^16.9.0 || ^17.0.0-0" + } }, - "lz-string": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", - "integrity": "sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==" + "node_modules/react-node-resolver": { + "version": "1.0.1", + "license": "MIT" }, - "magic-string": { - "version": "0.26.3", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.3.tgz", - "integrity": "sha512-u1Po0NDyFcwdg2nzHT88wSK0+Rih0N1M+Ph1Sp08k8yvFFU3KR72wryS7e1qMPJypt99WB7fIFVCA92mQrMjrg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" + "node_modules/react-popper": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" } }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, + "node_modules/react-redux": { + "version": "7.2.9", + "license": "MIT", "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "@babel/runtime": "^7.15.4", + "@types/react-redux": "^7.1.20", + "hoist-non-react-statics": "^3.3.2", + "loose-envify": "^1.4.0", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "peerDependencies": { + "react": "^16.8.3 || ^17 || ^18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true } } }, - "make-fetch-happen": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.0.tgz", - "integrity": "sha512-OnEfCLofQVJ5zgKwGk55GaqosqKjaR6khQlJY3dBAA+hM25Bc5CmX5rKUfVut+rYA3uidA7zb7AvcglU87rPRg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "markdown-it": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", - "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", - "requires": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - } + "node_modules/react-redux/node_modules/react-is": { + "version": "17.0.2", + "license": "MIT" }, - "matchit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/matchit/-/matchit-1.1.0.tgz", - "integrity": "sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==", + "node_modules/react-refresh": { + "version": "0.14.0", "dev": true, - "requires": { - "@arr/every": "^1.0.0" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "math.gl": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/math.gl/-/math.gl-3.6.3.tgz", - "integrity": "sha512-Yq9CyECvSDox9+5ETi2+x1bGTY5WvGUGL3rJfC4KPoCZAM51MGfrCm6rIn4yOJUVfMPs2a5RwMD+yGS/n1g3gg==", - "requires": { - "@math.gl/core": "3.6.3" + "node_modules/react-router": { + "version": "6.15.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.8.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" } }, - "matrix-crdt": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/matrix-crdt/-/matrix-crdt-0.2.0.tgz", - "integrity": "sha512-CmwC7/Wtujq6Jp1+MbIY0noEgGnT7YKl3lSOAtzIpDRyNPghHRxtgrDh+IR1kxsf/kFKWqxjgezzlG2vkUhGyA==", - "requires": { - "another-json": "^0.2.0", - "lodash": "^4.17.21", - "simple-peer": "^9.11.0", - "vscode-lib": "^0.1.0" + "node_modules/react-router-dom": { + "version": "6.15.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "matrix-events-sdk": { - "version": "0.0.1-beta.7", - "resolved": "https://registry.npmjs.org/matrix-events-sdk/-/matrix-events-sdk-0.0.1-beta.7.tgz", - "integrity": "sha512-9jl4wtWanUFSy2sr2lCjErN/oC8KTAtaeaozJtrgot1JiQcEI4Rda9OLgQ7nLKaqb4Z/QUx/fR3XpDzm5Jy1JA==" - }, - "matrix-js-sdk": { - "version": "19.4.0", - "resolved": "https://registry.npmjs.org/matrix-js-sdk/-/matrix-js-sdk-19.4.0.tgz", - "integrity": "sha512-B8Mm4jCsCHaMaChcdM3VhZDVKrn0nMSDtYvHmS15Iu8Pe0G4qmIpk2AoADBAL9U9yN3pCqvs3TDXaQhM8UxRRA==", - "requires": { - "@babel/runtime": "^7.12.5", - "another-json": "^0.2.0", - "browser-request": "^0.3.3", - "bs58": "^5.0.0", - "content-type": "^1.0.4", - "loglevel": "^1.7.1", - "matrix-events-sdk": "^0.0.1-beta.7", - "p-retry": "4", - "qs": "^6.9.6", - "request": "^2.88.2", - "unhomoglyph": "^1.0.6" - } - }, - "md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" + "node_modules/react-scrolllock": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "exenv": "^1.2.2" + }, + "peerDependencies": { + "react": "^16.3.0" } }, - "mdast-util-from-markdown": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.2.0.tgz", - "integrity": "sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" + "node_modules/react-select": { + "version": "5.7.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "mdast-util-to-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.3.0.tgz", - "integrity": "sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==", - "requires": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "longest-streak": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", - "zwitch": "^2.0.0" + "node_modules/react-textarea-autosize": { + "version": "8.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "mdast-util-to-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz", - "integrity": "sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==" - }, - "mdn-data": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", - "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", - "dev": true - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" - }, - "memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" } }, - "merge-options": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", - "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", - "dev": true, - "requires": { - "is-plain-obj": "^2.1.0" - }, + "node_modules/react-uid": { + "version": "2.3.3", + "license": "MIT", "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromark": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.0.10.tgz", - "integrity": "sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==", - "requires": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "node_modules/readable-stream": { + "version": "3.6.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/redux": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" } }, - "micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/reflect.getprototypeof": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", - "requires": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" - } + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "license": "MIT" }, - "micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", - "requires": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" } }, - "micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", - "requires": { - "micromark-util-symbol": "^1.0.0" + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/regexpu-core": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "node_modules/regjsparser": { + "version": "0.9.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" } }, - "micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", - "requires": { - "micromark-util-symbol": "^1.0.0" + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", - "requires": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "node_modules/rehype-minify-whitespace": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-embedded": "^2.0.0", + "hast-util-is-element": "^2.0.0", + "hast-util-whitespace": "^2.0.0", + "unified": "^10.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==" + "node_modules/rehype-parse": { + "version": "8.0.5", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^7.0.0", + "parse5": "^6.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==" + "node_modules/rehype-parse/node_modules/parse5": { + "version": "6.0.1", + "license": "MIT" }, - "micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", - "requires": { - "micromark-util-symbol": "^1.0.0" + "node_modules/rehype-remark": { + "version": "9.1.2", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "hast-util-to-mdast": "^8.3.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", - "requires": { - "micromark-util-types": "^1.0.0" + "node_modules/rehype-stringify": { + "version": "9.0.4", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "micromark-util-sanitize-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.0.0.tgz", - "integrity": "sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==", - "requires": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "node_modules/remark-gfm": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", - "requires": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "node_modules/remark-parse": { + "version": "10.0.2", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==" - }, - "micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "node_modules/remark-rehype": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-to-hast": "^12.1.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" + "node_modules/remark-stringify": { + "version": "10.0.3", + "license": "MIT", + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/require-directory": { + "version": "2.1.1", "dev": true, - "requires": { - "brace-expansion": "^1.1.7" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "engines": { + "node": ">=0.10.0" } }, - "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "node_modules/requires-port": { + "version": "1.0.0", "dev": true, - "requires": { - "yallist": "^4.0.0" + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.4", + "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" } }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "minipass-fetch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", - "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "node_modules/restore-cursor": { + "version": "4.0.0", "dev": true, - "requires": { - "encoding": "^0.1.13", - "minipass": "^3.1.6", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", "dev": true, - "requires": { - "minipass": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/reusify": { + "version": "1.0.4", "dev": true, - "requires": { - "minipass": "^3.0.0" + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" } }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/rimraf": { + "version": "3.0.2", "dev": true, - "requires": { - "minipass": "^3.0.0" + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/rollup": { + "version": "3.28.0", "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "mjolnir.js": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-2.7.1.tgz", - "integrity": "sha512-72BeUWgTv2cj5aZQKpwL8caNUFhXZ9bDm1hxpNj70XJQ62IBnTZmtv/WPxJvtaVNhzNo+D2U8O6ryNI0zImYcw==", - "requires": { - "@types/hammerjs": "^2.0.41", - "hammerjs": "^2.0.8" + "node_modules/rollup-plugin-polyfill-node": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/plugin-inject": "^5.0.1" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", + "node_modules/rollup-plugin-webpack-stats": { + "version": "0.2.0", "dev": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "rollup": "^3.0.0" } }, - "mobx": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.6.1.tgz", - "integrity": "sha512-7su3UZv5JF+ohLr2opabjbUAERfXstMY+wiBtey8yNAPoB8H187RaQXuhFjNkH8aE4iHbDWnhDFZw0+5ic4nGQ==" + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" }, - "mobx-react-lite": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.0.tgz", - "integrity": "sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==", - "requires": {} + "node_modules/rrweb-cssom": { + "version": "0.6.0", + "dev": true, + "license": "MIT" }, - "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "node_modules/run-parallel": { + "version": "1.2.0", "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } + { + "type": "patreon", + "url": "https://www.patreon.com/feross" }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } + { + "type": "consulting", + "url": "https://feross.org/support" } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" } }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true + "node_modules/sade": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } }, - "monaco-editor": { - "version": "0.35.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.35.0.tgz", - "integrity": "sha512-BJfkAZ0EJ7JgrgWzqjfBNP9hPSS8NlfECEDMEIIiozV2UaPq22yeuOjgbd3TwMh3anH0krWZirXZfn8KUSxiOA==" + "node_modules/safe-array-concat": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" + "node_modules/safe-buffer": { + "version": "5.2.1", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", - "dev": true + "node_modules/safe-regex-test": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "ms": { + "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "dev": true, + "license": "MIT" }, - "multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "node_modules/saxes": { + "version": "6.0.0", "dev": true, - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, + "license": "ISC", "dependencies": { - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - } + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" } }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "nested-error-stacks": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", - "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", - "dev": true + "node_modules/serialize-javascript": { + "version": "6.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } }, - "nice-try": { + "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true + "license": "MIT" }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true + "node_modules/shallow-equal": { + "version": "1.2.1", + "license": "MIT" }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "node-gyp": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.1.0.tgz", - "integrity": "sha512-HkmN0ZpQJU7FLbJauJTHkHlSVAXlNGDAzH/VYFZGDOnFyn/Na3GlNJfkudmufOdS6/jNFhy88ObzL7ERz9es1g==", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node-gyp-build": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", - "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", - "dev": true + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "node_modules/signal-exit": { + "version": "3.0.7", "dev": true, - "requires": { - "abbrev": "1" - } + "license": "ISC" }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/sirv": { + "version": "2.0.3", "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mrmime": "^1.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" } }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true + "node_modules/sirv/node_modules/@polka/url": { + "version": "1.0.0-next.21", + "dev": true, + "license": "MIT" }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "node_modules/slash": { + "version": "2.0.0", "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", - "dev": true, - "requires": { - "semver": "^7.1.1" + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true + "node_modules/source-map-js": { + "version": "1.0.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "npm-package-arg": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", - "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", + "node_modules/source-map-support": { + "version": "0.5.21", "dev": true, - "requires": { - "hosted-git-info": "^3.0.6", - "semver": "^7.0.0", - "validate-npm-package-name": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "hosted-git-info": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", - "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - } + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "npm-packlist": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz", - "integrity": "sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw==", + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", "dev": true, - "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^1.1.2", - "npm-normalize-package-bin": "^1.0.1" + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", - "dev": true, - "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "npm-registry-fetch": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.0.tgz", - "integrity": "sha512-10LJQ/1+VhKrZjIuY9I/+gQTvumqqlgnsCufoXETHAPFTS3+M+Z5CFhZRDHGavmJ6rOye3UvNga88vl8n1r6gg==", - "dev": true, - "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } + "node_modules/speakingurl": { + "version": "14.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" } }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/stackback": { + "version": "0.0.2", "dev": true, - "requires": { - "path-key": "^3.0.0" - } + "license": "MIT" }, - "npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "node_modules/std-env": { + "version": "3.4.0", "dev": true, - "requires": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - } + "license": "MIT" }, - "nth-check": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", - "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "node_modules/stdin-discarder": { + "version": "0.1.0", "dev": true, - "requires": { - "boolbase": "~1.0.0" + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "nwsapi": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", - "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==", - "dev": true - }, - "nx": { - "version": "14.5.4", - "resolved": "https://registry.npmjs.org/nx/-/nx-14.5.4.tgz", - "integrity": "sha512-xv1nTaQP6kqVDE4PXcB1tLlgzNAPUHE/2vlqSLgxjNb6colKf0vrEZhVTjhnbqBeJiTb33gUx50bBXkurCkN5w==", - "dev": true, - "requires": { - "@nrwl/cli": "14.5.4", - "@nrwl/tao": "14.5.4", - "@parcel/watcher": "2.0.4", - "chalk": "4.1.0", - "chokidar": "^3.5.1", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^10.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.0.0", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.3.4", - "string-width": "^4.2.3", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^3.9.0", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.4.0", - "yargs-parser": "21.0.1" - }, - "dependencies": { - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" - } - }, - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - } + "node_modules/stream-browserify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.4", + "readable-stream": "^3.5.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "node_modules/string_decoder": { + "version": "1.3.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "node_modules/string-natural-compare": { + "version": "3.0.1", + "dev": true, + "license": "MIT" }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + "node_modules/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" + } }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/string.prototype.matchall": { + "version": "4.0.8", "dev": true, - "requires": { + "license": "MIT", + "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { + "node_modules/string.prototype.replaceall": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.entries": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", - "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", - "dev": true, - "requires": { + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.fromentries": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", - "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", - "dev": true, - "requires": { + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.getownpropertydescriptors": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz", - "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.4", + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", - "es-abstract": "^1.20.1" + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.hasown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", - "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "node_modules/stringify-entities": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "object.values": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", - "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1" + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/strip-ansi": { + "version": "6.0.1", "dev": true, - "requires": { - "wrappy": "1" + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/strip-bom": { + "version": "3.0.0", "dev": true, - "requires": { - "mimic-fn": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=4" } }, - "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "engines": { + "node": ">=10" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/strip-final-newline": { + "version": "3.0.0", "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/strip-json-comments": { + "version": "3.1.1", "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "orderedmap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.0.0.tgz", - "integrity": "sha512-buf4PoAMlh45b8a8gsGy/X6w279TSqkyAS0C0wdTSJwFSU+ljQFJON5I8NfjLHoCXwpSROIo2wr0g33T+kQshQ==" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true + "node_modules/strip-literal": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "p-event": { + "node_modules/stylis": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "license": "MIT" + }, + "node_modules/supabase": { + "version": "1.86.2", "dev": true, - "requires": { - "p-timeout": "^3.1.0" + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "bin-links": "^4.0.1", + "node-fetch": "^3.2.10", + "tar": "6.1.15" + }, + "bin": { + "supabase": "bin/supabase" + }, + "engines": { + "npm": ">=8" } }, - "p-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", - "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", + "node_modules/supabase/node_modules/node-fetch": { + "version": "3.3.2", "dev": true, - "requires": { - "p-map": "^5.1.0" + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", "dependencies": { - "aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "dev": true, - "requires": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - } - }, - "clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "dev": true, - "requires": { - "escape-string-regexp": "5.0.0" - } - }, - "escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true - }, - "indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true - }, - "p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", - "dev": true, - "requires": { - "aggregate-error": "^4.0.0" - } - } + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "p-finally": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "license": "MIT" + }, + "node_modules/tar": { + "version": "6.1.15", "dev": true, - "requires": { - "p-try": "^2.0.0" + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "requires": { - "p-limit": "^2.2.0" - } + "license": "ISC" }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/temp-dir": { + "version": "3.0.0", "dev": true, - "requires": { - "aggregate-error": "^3.0.0" + "license": "MIT", + "engines": { + "node": ">=14.16" } }, - "p-map-series": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", - "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", - "dev": true - }, - "p-pipe": { + "node_modules/tempy": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", - "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", - "dev": true - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-reduce": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", - "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", - "dev": true - }, - "p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "requires": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, + "license": "MIT", "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" - } - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" + "is-stream": "^3.0.0", + "temp-dir": "^3.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "p-wait-for": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-4.1.0.tgz", - "integrity": "sha512-i8nE5q++9h8oaQHWltS1Tnnv4IoMDOlqN7C0KFG2OdbK0iFJIt6CROZ8wfBM+K4Pxqfnq4C4lkkpXqTEpB5DZw==", + "node_modules/terser": { + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, - "requires": { - "p-timeout": "^5.0.0" - }, "dependencies": { - "p-timeout": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", - "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", - "dev": true - } + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "p-waterfall": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", - "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, - "requires": { - "p-reduce": "^2.0.0" + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" } }, - "pacote": { - "version": "13.6.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.1.tgz", - "integrity": "sha512-L+2BI1ougAPsFjXRyBhcKmfT016NscRFLv6Pz5EiNf1CCFJFU0pSKKQwsZTyAQB+sTuUL4TyFyp6J1Ork3dOqw==", + "node_modules/text-table": { + "version": "0.2.0", "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", - "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" - } - } - } + "license": "MIT" }, - "pad-left": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pad-left/-/pad-left-2.1.0.tgz", - "integrity": "sha512-HJxs9K9AztdIQIAIa/OIazRAUW/L6B9hbQDxO4X07roW3eo9XqZc2ur9bn1StH9CnbbI9EgvejHQX7CBpCF1QA==", - "requires": { - "repeat-string": "^1.5.4" + "node_modules/throttle-debounce": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=10" } }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "requires": { - "callsites": "^3.0.0" - } + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" }, - "parse-conflict-json": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", - "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", + "node_modules/tinybench": { + "version": "2.5.0", "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1", - "just-diff": "^5.0.1", - "just-diff-apply": "^5.2.0" - } + "license": "MIT" }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-5.0.0.tgz", - "integrity": "sha512-qOpH55/+ZJ4jUu/oLO+ifUKjFPNZGfnPJtzvGzKN/4oLMil5m9OH4VpOj6++9/ytJcfks4kzH2hhi87GL/OU9A==", + "node_modules/tinypool": { + "version": "0.6.0", "dev": true, - "requires": { - "protocols": "^2.0.0" + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "parse-url": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-7.0.2.tgz", - "integrity": "sha512-PqO4Z0eCiQ08Wj6QQmrmp5YTTxpYfONdOEamrtvK63AmzXpcavIVQubGHxOEwiIoDZFb8uDOoQFS0NCcjqIYQg==", + "node_modules/tinyspy": { + "version": "2.1.1", "dev": true, - "requires": { - "is-ssh": "^1.4.0", - "normalize-url": "^6.1.0", - "parse-path": "^5.0.0", - "protocols": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, - "parse5": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", - "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==", - "dev": true, - "requires": { - "entities": "^4.3.0" - }, + "node_modules/tippy.js": { + "version": "6.3.7", + "license": "MIT", "dependencies": { - "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", - "dev": true - } + "@popperjs/core": "^2.9.0" } }, - "patch-package": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", - "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", + "node_modules/tmp": { + "version": "0.0.33", "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, + "license": "MIT", "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "penpal": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/penpal/-/penpal-6.2.2.tgz", - "integrity": "sha512-RQD7hTx14/LY7QoS3tQYO3/fzVtwvZI+JeS5udgsu7FPaEDjlvfK9HBcme9/ipzSPKnrxSgacI9PI7154W62YQ==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", - "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "playwright": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.24.2.tgz", - "integrity": "sha512-iMWDLgaFRT+7dXsNeYwgl8nhLHsUrzFyaRVC+ftr++P1dVs70mPrFKBZrGp1fOKigHV9d1syC03IpPbqLKlPsg==", - "dev": true, - "requires": { - "playwright-core": "1.24.2" + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "playwright-core": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.24.2.tgz", - "integrity": "sha512-zfAoDoPY/0sDLsgSgLZwWmSCevIg1ym7CppBwllguVBNiHeixZkc1AdMuYUPZC6AdEYc4CxWEyLMBTw2YcmRrA==", - "dev": true - }, - "playwright-test": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/playwright-test/-/playwright-test-8.1.1.tgz", - "integrity": "sha512-FFfuPH6Q/AFoJQDJ6/ateZBBQoiJx8LS8eM0pWExgB0OS9nygnM+KMR/25/dfYdlgw1bESlwtBa5UrBwulvKIw==", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, - "requires": { - "buffer": "^6.0.3", - "camelcase": "^6.3.0", - "chokidar": "^3.5.3", - "cpy": "^9.0.1", - "esbuild": "0.14.39", - "events": "^3.3.0", - "globby": "^13.1.1", - "kleur": "^4.1.4", - "lilconfig": "^2.0.5", - "lodash": "^4.17.21", - "merge-options": "^3.0.4", - "nanoid": "^3.3.4", - "ora": "^6.1.0", - "p-wait-for": "4.1.0", - "path-browserify": "^1.0.1", - "playwright-core": "1.22.1", - "polka": "^0.5.2", - "premove": "^4.0.0", - "process": "^0.11.10", - "sade": "^1.8.1", - "sirv": "^2.0.2", - "source-map": "0.6.1", - "stream-browserify": "^3.0.0", - "strip-ansi": "^7.0.0", - "tape": "^5.5.3", - "tempy": "^3.0.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "bl": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.0.0.tgz", - "integrity": "sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==", - "dev": true, - "requires": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "dev": true - }, - "cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "dev": true, - "requires": { - "restore-cursor": "^4.0.0" - } - }, - "esbuild": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.39.tgz", - "integrity": "sha512-2kKujuzvRWYtwvNjYDY444LQIA3TyJhJIX3Yo4+qkFlDDtGlSicWgeHVJqMUP/2sSfH10PGwfsj+O2ro1m10xQ==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.39", - "esbuild-android-arm64": "0.14.39", - "esbuild-darwin-64": "0.14.39", - "esbuild-darwin-arm64": "0.14.39", - "esbuild-freebsd-64": "0.14.39", - "esbuild-freebsd-arm64": "0.14.39", - "esbuild-linux-32": "0.14.39", - "esbuild-linux-64": "0.14.39", - "esbuild-linux-arm": "0.14.39", - "esbuild-linux-arm64": "0.14.39", - "esbuild-linux-mips64le": "0.14.39", - "esbuild-linux-ppc64le": "0.14.39", - "esbuild-linux-riscv64": "0.14.39", - "esbuild-linux-s390x": "0.14.39", - "esbuild-netbsd-64": "0.14.39", - "esbuild-openbsd-64": "0.14.39", - "esbuild-sunos-64": "0.14.39", - "esbuild-windows-32": "0.14.39", - "esbuild-windows-64": "0.14.39", - "esbuild-windows-arm64": "0.14.39" - } - }, - "esbuild-android-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.39.tgz", - "integrity": "sha512-EJOu04p9WgZk0UoKTqLId9VnIsotmI/Z98EXrKURGb3LPNunkeffqQIkjS2cAvidh+OK5uVrXaIP229zK6GvhQ==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.39.tgz", - "integrity": "sha512-+twajJqO7n3MrCz9e+2lVOnFplRsaGRwsq1KL/uOy7xK7QdRSprRQcObGDeDZUZsacD5gUkk6OiHiYp6RzU3CA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.39.tgz", - "integrity": "sha512-ImT6eUw3kcGcHoUxEcdBpi6LfTRWaV6+qf32iYYAfwOeV+XaQ/Xp5XQIBiijLeo+LpGci9M0FVec09nUw41a5g==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.39.tgz", - "integrity": "sha512-/fcQ5UhE05OiT+bW5v7/up1bDsnvaRZPJxXwzXsMRrr7rZqPa85vayrD723oWMT64dhrgWeA3FIneF8yER0XTw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.39.tgz", - "integrity": "sha512-oMNH8lJI4wtgN5oxuFP7BQ22vgB/e3Tl5Woehcd6i2r6F3TszpCnNl8wo2d/KvyQ4zvLvCWAlRciumhQg88+kQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.39.tgz", - "integrity": "sha512-1GHK7kwk57ukY2yI4ILWKJXaxfr+8HcM/r/JKCGCPziIVlL+Wi7RbJ2OzMcTKZ1HpvEqCTBT/J6cO4ZEwW4Ypg==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.39.tgz", - "integrity": "sha512-g97Sbb6g4zfRLIxHgW2pc393DjnkTRMeq3N1rmjDUABxpx8SjocK4jLen+/mq55G46eE2TA0MkJ4R3SpKMu7dg==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.39.tgz", - "integrity": "sha512-4tcgFDYWdI+UbNMGlua9u1Zhu0N5R6u9tl5WOM8aVnNX143JZoBZLpCuUr5lCKhnD0SCO+5gUyMfupGrHtfggQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.39.tgz", - "integrity": "sha512-t0Hn1kWVx5UpCzAJkKRfHeYOLyFnXwYynIkK54/h3tbMweGI7dj400D1k0Vvtj2u1P+JTRT9tx3AjtLEMmfVBQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.39.tgz", - "integrity": "sha512-23pc8MlD2D6Px1mV8GMglZlKgwgNKAO8gsgsLLcXWSs9lQsCYkIlMo/2Ycfo5JrDIbLdwgP8D2vpfH2KcBqrDQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.39.tgz", - "integrity": "sha512-epwlYgVdbmkuRr5n4es3B+yDI0I2e/nxhKejT9H0OLxFAlMkeQZxSpxATpDc9m8NqRci6Kwyb/SfmD1koG2Zuw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.39.tgz", - "integrity": "sha512-W/5ezaq+rQiQBThIjLMNjsuhPHg+ApVAdTz2LvcuesZFMsJoQAW2hutoyg47XxpWi7aEjJGrkS26qCJKhRn3QQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.39.tgz", - "integrity": "sha512-IS48xeokcCTKeQIOke2O0t9t14HPvwnZcy+5baG13Z1wxs9ZrC5ig5ypEQQh4QMKxURD5TpCLHw2W42CLuVZaA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.39.tgz", - "integrity": "sha512-zEfunpqR8sMomqXhNTFEKDs+ik7HC01m3M60MsEjZOqaywHu5e5682fMsqOlZbesEAAaO9aAtRBsU7CHnSZWyA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.39.tgz", - "integrity": "sha512-Uo2suJBSIlrZCe4E0k75VDIFJWfZy+bOV6ih3T4MVMRJh1lHJ2UyGoaX4bOxomYN3t+IakHPyEoln1+qJ1qYaA==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.39.tgz", - "integrity": "sha512-secQU+EpgUPpYjJe3OecoeGKVvRMLeKUxSMGHnK+aK5uQM3n1FPXNJzyz1LHFOo0WOyw+uoCxBYdM4O10oaCAA==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.39.tgz", - "integrity": "sha512-qHq0t5gePEDm2nqZLb+35p/qkaXVS7oIe32R0ECh2HOdiXXkj/1uQI9IRogGqKkK+QjDG+DhwiUw7QoHur/Rwg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.39.tgz", - "integrity": "sha512-XPjwp2OgtEX0JnOlTgT6E5txbRp6Uw54Isorm3CwOtloJazeIWXuiwK0ONJBVb/CGbiCpS7iP2UahGgd2p1x+Q==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.39.tgz", - "integrity": "sha512-E2wm+5FwCcLpKsBHRw28bSYQw0Ikxb7zIMxw3OPAkiaQhLVr3dnVO8DofmbWhhf6b97bWzg37iSZ45ZDpLw7Ow==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.39", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.39.tgz", - "integrity": "sha512-sBZQz5D+Gd0EQ09tZRnz/PpVdLwvp/ufMtJ1iDFYddDaPpZXKqPyaxfYBLs3ueiaksQ26GGa7sci0OqFzNs7KA==", - "dev": true, - "optional": true - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "dev": true - }, - "is-unicode-supported": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.2.0.tgz", - "integrity": "sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==", - "dev": true - }, - "log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "dev": true, - "requires": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - } - }, - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - }, - "ora": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz", - "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==", - "dev": true, - "requires": { - "bl": "^5.0.0", - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - } - }, - "playwright-core": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.1.tgz", - "integrity": "sha512-H+ZUVYnceWNXrRf3oxTEKAr81QzFsCKu5Fp//fEjQvqgKkfA1iX3E9DBrPJpPNOrgVzcE+IqeI0fDmYJe6Ynnw==", - "dev": true - }, - "restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" } }, - "polka": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/polka/-/polka-0.5.2.tgz", - "integrity": "sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==", + "node_modules/totalist": { + "version": "3.0.1", "dev": true, - "requires": { - "@polka/url": "^0.5.0", - "trouter": "^2.0.1" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "node_modules/tough-cookie": { + "version": "4.1.3", "dev": true, - "requires": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, + "license": "BSD-3-Clause", "dependencies": { - "nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true - } + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" } }, - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "premove": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/premove/-/premove-4.0.0.tgz", - "integrity": "sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==", - "dev": true - }, - "prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" - }, - "probe.gl": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/probe.gl/-/probe.gl-3.5.2.tgz", - "integrity": "sha512-8lFQVmi7pMQZkqfj8+VjX4GU9HTkyxgRm5/h/xxA/4/IvZPv3qtP996L+awPwZsrPRKEw99t12SvqEHqSls/sA==", - "requires": { - "@babel/runtime": "^7.0.0", - "@probe.gl/env": "3.5.2", - "@probe.gl/log": "3.5.2", - "@probe.gl/stats": "3.5.2" + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" } }, - "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "requires": { - "asap": "~2.0.3" + "node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" } }, - "promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "promise-call-limit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.1.tgz", - "integrity": "sha512-3+hgaa19jzCGLuSCbieeRsu5C2joKfYn8pY6JAuXFRVfF4IO+L7UPpFWNTeWT9pM7uhskvbPPd/oEOktCn317Q==", - "dev": true + "node_modules/trim-trailing-lines": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true + "node_modules/trough": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "promise-retry": { + "node_modules/trouter": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" + "license": "MIT", + "dependencies": { + "matchit": "^1.0.0" + }, + "engines": { + "node": ">=6" } }, - "promzard": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", + "node_modules/tsconfig-paths": { + "version": "3.14.2", "dev": true, - "requires": { - "read": "1" - } - }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, + "license": "MIT", "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - } + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "prosemirror-commands": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.3.0.tgz", - "integrity": "sha512-BwBbZ5OAScPcm0x7H8SPbqjuEJnCU2RJT9LDyOiiIl/3NbL1nJZI4SFNHwU2e/tRr2Xe7JsptpzseqvZvToLBQ==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" } }, - "prosemirror-dropcursor": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.5.0.tgz", - "integrity": "sha512-vy7i77ddKyXlu8kKBB3nlxLBnsWyKUmQIPB5x8RkYNh01QNp/qqGmdd5yZefJs0s3rtv5r7Izfu2qbtr+tYAMQ==", - "requires": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "prosemirror-gapcursor": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.0.tgz", - "integrity": "sha512-9Tdx83xB2W4Oqchm12FtCkSizbqvi64cjs1I9TRPblqdA5TUWoVZ4ZI+t71Jh6HSEh4cDMPzx3UwfryJtKlb/w==", - "requires": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "prosemirror-history": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", - "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", - "requires": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "rope-sequence": "^1.3.0" - } + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" }, - "prosemirror-keymap": { + "node_modules/type": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", - "requires": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } + "license": "ISC" }, - "prosemirror-model": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.18.1.tgz", - "integrity": "sha512-IxSVBKAEMjD7s3n8cgtwMlxAXZrC7Mlag7zYsAKDndAqnDScvSmp/UdnRTV/B33lTCVU3CCm7dyAn/rVVD0mcw==", - "requires": { - "orderedmap": "^2.0.0" + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "prosemirror-schema-list": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.0.tgz", - "integrity": "sha512-8PT/9xOx1HHdC7fDNNfhQ50Z8Mzu7nKyA1KCDltSpcZVZIbB0k7KtsHrnXyuIhbLlScoymBiLZ00c5MH6wdFsA==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "prosemirror-state": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.1.tgz", - "integrity": "sha512-U/LBDW2gNmVa07sz/D229XigSdDQ5CLFwVB1Vb32MJbAHHhWe/6pOc721faI17tqw4pZ49i1xfY/jEZ9tbIhPg==", - "requires": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "prosemirror-transform": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.6.0.tgz", - "integrity": "sha512-MAp7AjsjEGEqQY0sSMufNIUuEyB1ZR9Fqlm8dTwwWwpEJRv/plsKjWXBbx52q3Ml8MtaMcd7ic14zAHVB3WaMw==", - "requires": { - "prosemirror-model": "^1.0.0" + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" } }, - "prosemirror-view": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.26.2.tgz", - "integrity": "sha512-CGKw+GadkfSBEwRAJTHCEKJ4DlV6/3IhAdjpwGyZHUHtbP7jX4Ol4zmi7xa2c6GOabDlIJLYXJydoNYLX7lNeQ==", - "requires": { - "prosemirror-model": "^1.16.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true - }, - "protocols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", - "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true + "node_modules/typed-array-length": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } }, - "raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "requires": { - "performance-now": "^2.1.0" + "node_modules/ua-parser-js": { + "version": "1.0.35", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "license": "MIT", + "engines": { + "node": "*" } }, - "raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + "node_modules/uc.micro": { + "version": "1.0.6", + "license": "MIT" }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { - "safe-buffer": "^5.1.0" - } + "node_modules/ufo": { + "version": "1.2.0", + "dev": true, + "license": "MIT" }, - "react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" + "node_modules/unbox-primitive": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "react-avatar": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/react-avatar/-/react-avatar-3.10.0.tgz", - "integrity": "sha512-FB20OZIAJif0WNzGy4PwT5Nca4rekrYWiswBofuGAa5FKpRrFbJKY69267dRXbFqIYQrA/OxNB/TjhnmP2gsEQ==", - "requires": { - "core-js": "^3.6.1", - "is-retina": "^1.0.3", - "md5": "^2.0.0" + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "react-beautiful-dnd-next": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/react-beautiful-dnd-next/-/react-beautiful-dnd-next-11.0.5.tgz", - "integrity": "sha512-kM5Mob41HkA3ShS9uXqeMkW51L5bVsfttxfrwwHucu7I6SdnRKCyN78t6QiLH/UJQQ8T4ukI6NeQAQQpGwolkg==", - "requires": { - "@babel/runtime-corejs2": "^7.4.5", - "css-box-model": "^1.1.2", - "memoize-one": "^5.0.4", - "raf-schd": "^4.0.0", - "react-redux": "^7.0.3", - "redux": "^4.0.1", - "tiny-invariant": "^1.0.4", - "use-memo-one": "^1.1.0" - }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" - } + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "react-clientside-effect": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", - "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", - "requires": { - "@babel/runtime": "^7.12.13" + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "react-display-name": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/react-display-name/-/react-display-name-0.2.5.tgz", - "integrity": "sha512-I+vcaK9t4+kypiSgaiVWAipqHRXYmZIuAiS8vzFvXHHXVigg/sMKwlRgLy6LH2i3rmP+0Vzfl5lFsFRwF1r3pg==" - }, - "react-dnd": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-7.7.0.tgz", - "integrity": "sha512-anpJDKMgdXE6kXvtBFmIAe1fuaexpVy7meUyNjiTfCnjQ1mRvnttGTVvcW9fMKijsUQYadiyvzd3BRxteFuVXg==", - "peer": true, - "requires": { - "@types/hoist-non-react-statics": "^3.3.1", - "dnd-core": "^7.7.0", - "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.1.0", - "shallowequal": "^1.1.0" + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" } }, - "react-dnd-html5-backend": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-14.1.0.tgz", - "integrity": "sha512-6ONeqEC3XKVf4eVmMTe0oPds+c5B9Foyj8p/ZKLb7kL2qh9COYxiBHv3szd6gztqi/efkmriywLUVlPotqoJyw==", - "requires": { - "dnd-core": "14.0.1" - }, + "node_modules/unified": { + "version": "10.1.2", + "license": "MIT", "dependencies": { - "dnd-core": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-14.0.1.tgz", - "integrity": "sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==", - "requires": { - "@react-dnd/asap": "^4.0.0", - "@react-dnd/invariant": "^2.0.0", - "redux": "^4.1.1" - } - } - } - }, - "react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "react-fast-compare": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", - "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" - }, - "react-focus-lock": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.1.tgz", - "integrity": "sha512-pSWOQrUmiKLkffPO6BpMXN7SNKXMsuOakl652IBuALAu1esk+IcpJyM+ALcYzPTTFz1rD0R54aB9A4HuP5t1Wg==", - "requires": { - "@babel/runtime": "^7.0.0", - "focus-lock": "^0.11.2", - "prop-types": "^15.6.2", - "react-clientside-effect": "^1.2.6", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" } }, - "react-github-btn": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/react-github-btn/-/react-github-btn-1.3.0.tgz", - "integrity": "sha512-IpyNbbYENfmYOLoRkeKauAZF5PTkplawRquSiI7uDVJBUCVrR5jQ9zYBx4TlpzhWeYU+BIfKNnXtz2wvQJPsZg==", - "requires": { - "github-buttons": "^2.21.1" + "node_modules/unified/node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "react-icons": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.6.0.tgz", - "integrity": "sha512-rR/L9m9340yO8yv1QT1QurxWQvWpbNHqVX0fzMln2HEb9TEIrQRGsqiNFQfiv9/JEUbyHmHPlNTB2LWm2Ttz0g==", - "requires": {} - }, - "react-input-autosize": { + "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-3.0.0.tgz", - "integrity": "sha512-nL9uS7jEs/zu8sqwFE5MAPx6pPkNAriACQ2rGLlqmKr2sPGtN7TXTyDdQt4lbNXVx7Uzadb40x8qotIuru6Rhg==", - "requires": { - "prop-types": "^15.5.8" + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "react-inspector": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-6.0.1.tgz", - "integrity": "sha512-cxKSeFTf7jpSSVddm66sKdolG90qURAX3g1roTeaN6x0YEbtWc8JpmFN9+yIqLNH2uEkYerWLtJZIXRIFuBKrg==", - "requires": {} - }, - "react-intl-next": { - "version": "npm:react-intl@5.25.1", - "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-5.25.1.tgz", - "integrity": "sha512-pkjdQDvpJROoXLMltkP/5mZb0/XqrqLoPGKUCfbdkP8m6U9xbK40K51Wu+a4aQqTEvEK5lHBk0fWzUV72SJ3Hg==", - "requires": { - "@formatjs/ecma402-abstract": "1.11.4", - "@formatjs/icu-messageformat-parser": "2.1.0", - "@formatjs/intl": "2.2.1", - "@formatjs/intl-displaynames": "5.4.3", - "@formatjs/intl-listformat": "6.5.3", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/react": "16 || 17 || 18", - "hoist-non-react-statics": "^3.3.2", - "intl-messageformat": "9.13.0", - "tslib": "^2.1.0" + "node_modules/unist-util-find-after": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "peer": true - }, - "react-loosely-lazy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/react-loosely-lazy/-/react-loosely-lazy-1.0.0.tgz", - "integrity": "sha512-Ai/ox310hio8D0FxiZPEORTnHgyTeQ3seNhxVb+jh1hBrEgBlvB4Pvvb5zAKiktwcYGNIHQaZqtATkS68WLw5Q==", - "requires": {} - }, - "react-node-resolver": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-node-resolver/-/react-node-resolver-1.0.1.tgz", - "integrity": "sha512-IiSe0h2+IJo4enSlbdYjdwJnY86A7TwNxnfQVG2yApxVkHj9es1jum9Lb2aiBXKkLnwAj7ufBBlAa0ROU0o9nA==" + "node_modules/unist-util-generated": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "requires": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" + "node_modules/unist-util-is": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "react-redux": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.8.tgz", - "integrity": "sha512-6+uDjhs3PSIclqoCk0kd6iX74gzrGc3W5zcAjbrFgEdIjRSQObdIwfx80unTkVUYvbQ95Y8Av3OvFHq1w5EOUw==", - "requires": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" + "node_modules/unist-util-position": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "license": "MIT", "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } + "@types/unist": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true + "node_modules/unist-util-visit": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "react-router": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.2.2.tgz", - "integrity": "sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ==", - "requires": { - "history": "^5.2.0" + "node_modules/unist-util-visit-parents": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "react-router-dom": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.2.2.tgz", - "integrity": "sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ==", - "requires": { - "history": "^5.2.0", - "react-router": "6.2.2" + "node_modules/universalify": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, - "react-scrolllock": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scrolllock/-/react-scrolllock-5.0.1.tgz", - "integrity": "sha512-poeEsjnZAlpA6fJlaNo4rZtcip2j6l5mUGU/SJe1FFlicEudS943++u7ZSdA7lk10hoyYK3grOD02/qqt5Lxhw==", - "requires": { - "exenv": "^1.2.2" + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" } }, - "react-select": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-4.3.1.tgz", - "integrity": "sha512-HBBd0dYwkF5aZk1zP81Wx5UsLIIT2lSvAY2JiJo199LjoLHoivjn9//KsmvQMEFGNhe58xyuOITjfxKCcGc62Q==", - "requires": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.1.1", - "memoize-one": "^5.0.0", - "prop-types": "^15.6.0", - "react-input-autosize": "^3.0.0", - "react-transition-group": "^4.3.0" - }, - "dependencies": { - "@emotion/cache": { - "version": "11.10.3", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.3.tgz", - "integrity": "sha512-Psmp/7ovAa8appWh3g51goxu/z3iVms7JXOreq136D8Bbn6dYraPnmL6mdM8GThEx9vwSn92Fz+mGSjBzN8UPQ==", - "requires": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.0.13" - } - }, - "@emotion/sheet": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.0.tgz", - "integrity": "sha512-OiTkRgpxescko+M51tZsMq7Puu/KP55wMT8BgpcXVG2hqXc0Vo0mfymJ/Uj24Hp0i083ji/o0aLddh08UEjq8w==" - }, - "@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, - "memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + { + "type": "github", + "url": "https://github.com/sponsors/ai" } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "requires": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - } - }, - "react-uid": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/react-uid/-/react-uid-2.3.2.tgz", - "integrity": "sha512-oeaoT4YOjsqHdrEJoO8SONNNBsoGh7AJPbsNqRK6Dv8UMdctWxA4ncj9gAA/Odki5g0GZaDSR7HydBJ8HxwgNg==", - "requires": { - "tslib": "^2.0.0" + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "node_modules/url-parse": { + "version": "1.5.10", "dev": true, - "requires": { - "mute-stream": "~0.0.4" + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "read-cmd-shim": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz", - "integrity": "sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog==", - "dev": true - }, - "read-package-json": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz", - "integrity": "sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg==", - "dev": true, - "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "hosted-git-info": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.0.0.tgz", - "integrity": "sha512-rRnjWu0Bxj+nIfUOkz0695C0H6tRrN5iYIzYejb0tDEefe2AekHu/U5Kn9pEie5vsJqpNQU02az7TGSH3qpz4Q==", - "dev": true, - "requires": { - "lru-cache": "^7.5.1" - } - }, - "normalize-package-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.0.tgz", - "integrity": "sha512-m+GL22VXJKkKbw62ZaBBjv8u6IE3UI4Mh5QakIqs3fWiKe0Xyi6L97hakwZK41/LD4R/2ly71Bayx0NLMwLA/g==", - "dev": true, - "requires": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - } + "node_modules/use-callback-ref": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "node_modules/use-composed-ref": { + "version": "1.3.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true + "node_modules/use-latest": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" + "node_modules/use-memo-one": { + "version": "1.1.3", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" + "node_modules/use-prefers-color-scheme": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": ">= 16.8.0" } }, - "realistic-structured-clone": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/realistic-structured-clone/-/realistic-structured-clone-2.0.4.tgz", - "integrity": "sha512-lItAdBIFHUSe6fgztHPtmmWqKUgs+qhcYLi3wTRUl4OTB3Vb8aBVSjGfQZUvkmJCKoX3K9Wf7kyLp/F/208+7A==", - "dev": true, - "requires": { - "core-js": "^3.4", - "domexception": "^1.0.1", - "typeson": "^6.1.0", - "typeson-registry": "^1.0.0-alpha.20" - }, - "dependencies": { - "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", - "dev": true, - "requires": { - "webidl-conversions": "^4.0.2" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true + "node_modules/use-sidecar": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" - }, - "redux": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.0.tgz", - "integrity": "sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==", - "requires": { - "@babel/runtime": "^7.9.2" + "node_modules/utf-8-validate": { + "version": "5.0.10", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" } }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", - "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "node_modules/util": { + "version": "0.12.5", "dev": true, - "requires": { - "regenerate": "^1.4.2" + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "devOptional": true, + "license": "MIT" }, - "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "node_modules/uvu": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0", + "diff": "^5.0.0", + "kleur": "^4.0.3", + "sade": "^1.7.3" + }, + "bin": { + "uvu": "bin.js" + }, + "engines": { + "node": ">=8" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", - "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", + "node_modules/v8-to-istanbul": { + "version": "9.1.0", "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.0.1", - "regjsgen": "^0.6.0", - "regjsparser": "^0.8.2", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" } }, - "regjsgen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true - }, - "regjsparser": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", - "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" + "node_modules/vfile": { + "version": "5.3.7", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-parse": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.1.tgz", - "integrity": "sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "unified": "^10.0.0" + "node_modules/vfile-message": { + "version": "3.1.4", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "remark-stringify": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.2.tgz", - "integrity": "sha512-6wV3pvbPvHkbNnWB0wdDvVFHOe1hBRAx1Q/5g/EpH4RppAII6J8Gnwe7VbHuXaoKIF6LAg6ExTel/+kNqSQ7lw==", - "requires": { - "@types/mdast": "^3.0.0", - "mdast-util-to-markdown": "^1.0.0", - "unified": "^10.0.0" + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" } }, - "remixicon-react": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remixicon-react/-/remixicon-react-1.0.0.tgz", - "integrity": "sha512-KOXlc8EdKdujr2f/2idyFSQRjUB8p0HNiWZYBBzRsTRlTXFuSAFfnGq9culNjhCGmc92Jbtfr9OP0MXWvTMdsQ==", - "requires": {} - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } + "node_modules/vite": { + "version": "4.4.9", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true }, - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "sass": { + "optional": true + }, + "stylus": { + "optional": true }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } + "sugarss": { + "optional": true }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "terser": { + "optional": true } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/vite-node": { + "version": "0.33.0", "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", + "node_modules/vite-plugin-pwa": { + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.16.4.tgz", + "integrity": "sha512-lmwHFIs9zI2H9bXJld/zVTbCqCQHZ9WrpyDMqosICDV0FVnCJwniX1NMDB79HGTIZzOQkY4gSZaVTJTw6maz/Q==", "dev": true, - "requires": { - "through": "~2.3.4" + "dependencies": { + "debug": "^4.3.4", + "fast-glob": "^3.2.12", + "pretty-bytes": "^6.0.0", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0", + "workbox-build": "^7.0.0", + "workbox-window": "^7.0.0" } }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/vitest": { + "version": "0.33.0", "dev": true, - "requires": { - "glob": "^7.1.3" - }, + "license": "MIT", "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true } } }, - "rollup": { - "version": "2.79.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.0.tgz", - "integrity": "sha512-x4KsrCgwQ7ZJPcFA/SUu6QVcYlO7uRLfLAy0DSA4NS2eG8japdbpM50ToH7z4iObodRYOJ0soneF0iaQRJ6zhA==", - "dev": true, - "peer": true, - "requires": { - "fsevents": "~2.3.2" - } + "node_modules/vscode-lib": { + "version": "0.1.2", + "license": "MIT" }, - "rollup-plugin-inject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", - "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1", - "magic-string": "^0.25.3", - "rollup-pluginutils": "^2.8.1" - }, - "dependencies": { - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - } - } + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" }, - "rollup-plugin-node-polyfills": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", - "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", "dev": true, - "requires": { - "rollup-plugin-inject": "^3.0.0" + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" } }, - "rollup-plugin-polyfill-node": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.10.2.tgz", - "integrity": "sha512-5GMywXiLiuQP6ZzED/LO/Q0HyDi2W6b8VN+Zd3oB0opIjyRs494Me2ZMaqKWDNbGiW4jvvzl6L2n4zRgxS9cSQ==", - "dev": true, - "requires": { - "@rollup/plugin-inject": "^4.0.0" + "node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" } }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "node_modules/wcwidth": { + "version": "1.0.1", "dev": true, - "requires": { - "estree-walker": "^0.6.1" + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" } }, - "rope-sequence": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", - "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "requires": { - "queue-microtask": "^1.2.2" + "node_modules/web-namespaces": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "rxjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.6.tgz", - "integrity": "sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==", + "node_modules/web-streams-polyfill": { + "version": "3.2.1", "dev": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "requires": { - "mri": "^1.1.0" + "license": "MIT", + "engines": { + "node": ">= 8" } }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "node_modules/web-vitals": { + "version": "1.1.2", + "license": "Apache-2.0" }, - "saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "node_modules/webidl-conversions": { + "version": "7.0.0", "dev": true, - "requires": { - "xmlchars": "^2.2.0" - } - }, - "scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "requires": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" } }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - }, + "node_modules/websocket": { + "version": "1.0.34", + "license": "Apache-2.0", "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - } + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" } }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" } }, - "set-blocking": { + "node_modules/websocket/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "license": "MIT" }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shallow-equal": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", - "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" - }, - "shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" - }, - "shebang-command": { + "node_modules/whatwg-encoding": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-peer": { - "version": "9.11.1", - "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", - "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", - "requires": { - "buffer": "^6.0.3", - "debug": "^4.3.2", - "err-code": "^3.0.1", - "get-browser-rtc": "^1.1.0", - "queue-microtask": "^1.2.3", - "randombytes": "^2.1.0", - "readable-stream": "^3.6.0" - }, - "dependencies": { - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "err-code": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", - "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" - } - } - }, - "sirv": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.2.tgz", - "integrity": "sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==", "dev": true, - "requires": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", - "totalist": "^3.0.0" - }, + "license": "MIT", "dependencies": { - "@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", - "dev": true - } + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" } }, - "slash": { + "node_modules/whatwg-mimetype": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "socks": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", - "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - } - }, - "socks-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", - "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" + "license": "MIT", + "engines": { + "node": ">=12" } }, - "sort-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", - "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", + "node_modules/whatwg-url": { + "version": "11.0.0", "dev": true, - "requires": { - "is-plain-obj": "^2.0.0" - }, + "license": "MIT", "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/which": { + "version": "2.0.2", "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==" + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "node_modules/which-builtin-type": { + "version": "1.1.3", "dev": true, - "requires": { - "through": "2" + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/which-collection": { + "version": "1.0.1", "dev": true, - "requires": { - "readable-stream": "^3.0.0" + "license": "MIT", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "node_modules/which-typed-array": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "node_modules/why-is-node-running": { + "version": "2.2.2", "dev": true, - "requires": { - "minipass": "^3.1.1" + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" } }, - "stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true - }, - "stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "node_modules/workbox-background-sync": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz", + "integrity": "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA==", "dev": true, - "requires": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" + "node_modules/workbox-broadcast-update": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.0.0.tgz", + "integrity": "sha512-oUuh4jzZrLySOo0tC0WoKiSg90bVAcnE98uW7F8GFiSOXnhogfNDGZelPJa+6KpGBO5+Qelv04Hqx2UD+BJqNQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0" } }, - "string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/workbox-build": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.0.0.tgz", + "integrity": "sha512-CttE7WCYW9sZC+nUYhQg3WzzGPr4IHmrPnjKiu3AMXsiNQKx+l4hHl63WTrnicLmKEKHScWDH8xsGBdrYgtBzg==", + "dev": true, + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.0.0", + "workbox-broadcast-update": "7.0.0", + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-google-analytics": "7.0.0", + "workbox-navigation-preload": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-range-requests": "7.0.0", + "workbox-recipes": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0", + "workbox-streams": "7.0.0", + "workbox-sw": "7.0.0", + "workbox-window": "7.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" } }, - "string.prototype.matchall": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", - "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.1", - "side-channel": "^1.0.4" + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } } }, - "string.prototype.replaceall": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.replaceall/-/string.prototype.replaceall-1.0.6.tgz", - "integrity": "sha512-OA8VDhE7ssNFlyoDXUHxw6V5cjgPrtosyJKqJX5i1P5tV9eUynsbhx1yz0g+Ye4fjFwAxhKLxt8GSRx2Aqc+Sw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.1", - "get-intrinsic": "^1.1.1", - "has-symbols": "^1.0.2", - "is-regex": "^1.1.4" + "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "string.prototype.trim": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz", - "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==", + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" } }, - "string.prototype.trimend": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", - "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" } }, - "string.prototype.trimstart": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", - "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5" - } + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "requires": { - "ansi-regex": "^5.0.1" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-final-newline": { + "node_modules/workbox-build/node_modules/crypto-random-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, - "requires": { - "min-indent": "^1.0.0" + "engines": { + "node": ">=8" } }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "dev": true }, - "strip-literal": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-0.4.2.tgz", - "integrity": "sha512-pv48ybn4iE1O9RLgCAN0iU4Xv7RlBTiit6DKmMiErbs9x1wH6vXBs45tWc0H5wUIF6TLTrKweqkmYF/iraQKNw==", + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "requires": { - "acorn": "^8.8.0" - } - }, - "strong-log-transformer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", - "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", - "dev": true, - "requires": { - "duplexer": "^0.1.1", - "minimist": "^1.2.0", - "through": "^2.3.4" - } - }, - "styled-components": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-3.2.6.tgz", - "integrity": "sha512-CpFUIyKXl5JP0PYQ7aNncpn6Oxts+5JfMvvdhjIN2S8afPZbw/VdgVucNkMrPrMY7aIFoYrm4qwti1V+vyhi2g==", - "requires": { - "buffer": "^5.0.3", - "css-to-react-native": "^2.0.3", - "fbjs": "^0.8.16", - "hoist-non-react-statics": "^2.5.0", - "is-plain-object": "^2.0.1", - "prop-types": "^15.5.4", - "react-is": "^16.3.1", - "stylis": "^3.5.0", - "stylis-rule-sheet": "^0.0.10", - "supports-color": "^3.2.3" - }, - "dependencies": { - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==" - }, - "fbjs": { - "version": "0.8.18", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz", - "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==", - "requires": { - "core-js": "^1.0.0", - "isomorphic-fetch": "^2.1.1", - "loose-envify": "^1.0.0", - "object-assign": "^4.1.0", - "promise": "^7.1.1", - "setimmediate": "^1.0.5", - "ua-parser-js": "^0.7.30" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==" - }, - "hoist-non-react-statics": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz", - "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==" - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "requires": { - "isobject": "^3.0.1" - } - }, - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "stylis": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.4.tgz", - "integrity": "sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==" - }, - "stylis-rule-sheet": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz", - "integrity": "sha512-nTbZoaqoBnmK+ptANthb10ZRZOGC+EmTLLUxeYIuHNkEKcmKgXX1XWKkUBT2Ac4es3NybooPe0SmvKdhKJZAuw==", - "requires": {} - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "requires": { - "has-flag": "^1.0.0" - } - } + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "stylis": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz", - "integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==" - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/workbox-build/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "requires": { - "has-flag": "^4.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "supports-preserve-symlinks-flag": { + "node_modules/workbox-build/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" - }, - "svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true - }, - "svgo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", - "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", - "css-tree": "1.0.0-alpha.37", - "csso": "^4.0.2", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "tabbable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-1.1.3.tgz", - "integrity": "sha512-nOWwx35/JuDI4ONuF0ZTo6lYvI0fY0tZCH1ErzY2EXfu4az50ZyiUX8X073FLiZtmWUVlkRnuXsehjJgCw9tYg==" - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" - } + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" } }, - "tape": { + "node_modules/workbox-build/node_modules/pretty-bytes": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.0.tgz", - "integrity": "sha512-LyM4uqbiTAqDgsHTY0r1LH66yE24P3SZaz5TL3mPUds0XCTFl/0AMUBrjgBjUclvbPTFB4IalXg0wFfbTuuu/Q==", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true, - "requires": { - "array.prototype.every": "^1.1.3", - "call-bind": "^1.0.2", - "deep-equal": "^2.0.5", - "defined": "^1.0.0", - "dotignore": "^0.1.2", - "for-each": "^0.3.3", - "get-package-type": "^0.1.0", - "glob": "^7.2.3", - "has": "^1.0.3", - "has-dynamic-import": "^2.0.1", - "inherits": "^2.0.4", - "is-regex": "^1.1.4", - "minimist": "^1.2.6", - "object-inspect": "^1.12.2", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.3", - "resolve": "^2.0.0-next.3", - "resumer": "^0.0.0", - "string.prototype.trim": "^1.2.6", - "through": "^2.3.8" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - } + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/workbox-build/node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" } }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true - }, - "tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "node_modules/workbox-build/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, - "requires": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, "dependencies": { - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - } + "randombytes": "^2.1.0" } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" } }, - "text-encoding-utf-8": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", - "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "node_modules/workbox-build/node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, - "requires": { - "readable-stream": "3" + "engines": { + "node": ">=8" } }, - "tiny-invariant": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz", - "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==" - }, - "tinybench": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", - "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==", - "dev": true - }, - "tinypool": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", - "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==", - "dev": true - }, - "tinyspy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", - "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==", - "dev": true + "node_modules/workbox-build/node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "requires": { - "@popperjs/core": "^2.9.0" + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" } }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/workbox-build/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "to-fast-properties": { + "node_modules/workbox-build/node_modules/unique-string": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "requires": { - "is-number": "^7.0.0" + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "totalist": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.0.tgz", - "integrity": "sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==", + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, "dependencies": { - "universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true - } + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } }, - "tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "node_modules/workbox-cacheable-response": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", + "integrity": "sha512-0lrtyGHn/LH8kKAJVOQfSu3/80WDc9Ma8ng0p2i/5HuUndGttH+mGMSvOskjOdFImLs2XZIimErp7tSOPmu/6g==", "dev": true, - "requires": { - "punycode": "^2.1.1" + "dependencies": { + "workbox-core": "7.0.0" } }, - "treeverse": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", - "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "node_modules/workbox-core": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.0.0.tgz", + "integrity": "sha512-81JkAAZtfVP8darBpfRTovHg8DGAVrKFgHpOArZbdFd78VqHr5Iw65f2guwjE2NlCFbPFDoez3D3/6ZvhI/rwQ==", "dev": true }, - "trough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz", - "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==" - }, - "trouter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/trouter/-/trouter-2.0.1.tgz", - "integrity": "sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==", + "node_modules/workbox-expiration": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.0.0.tgz", + "integrity": "sha512-MLK+fogW+pC3IWU9SFE+FRStvDVutwJMR5if1g7oBJx3qwmO69BNoJQVaMXq41R0gg3MzxVfwOGKx3i9P6sOLQ==", "dev": true, - "requires": { - "matchit": "^1.0.0" + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.0.0" } }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "node_modules/workbox-google-analytics": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.0.0.tgz", + "integrity": "sha512-MEYM1JTn/qiC3DbpvP2BVhyIH+dV/5BjHk756u9VbwuAhu0QHyKscTnisQuz21lfRpOwiS9z4XdqeVAKol0bzg==", "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, "dependencies": { - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } + "workbox-background-sync": "7.0.0", + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" } }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "node_modules/workbox-navigation-preload": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.0.0.tgz", + "integrity": "sha512-juWCSrxo/fiMz3RsvDspeSLGmbgC0U9tKqcUPZBCf35s64wlaLXyn2KdHHXVQrb2cqF7I0Hc9siQalainmnXJA==", "dev": true, - "requires": { - "tslib": "^1.8.1" - }, "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "workbox-core": "7.0.0" } }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "requires": { - "safe-buffer": "^5.0.1" + "node_modules/workbox-precaching": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.0.0.tgz", + "integrity": "sha512-EC0vol623LJqTJo1mkhD9DZmMP604vHqni3EohhQVwhJlTgyKyOkMrZNy5/QHfOby+39xqC01gv4LjOm4HSfnA==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" } }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "node_modules/workbox-range-requests": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.0.0.tgz", + "integrity": "sha512-SxAzoVl9j/zRU9OT5+IQs7pbJBOUOlriB8Gn9YMvi38BNZRbM+RvkujHMo8FOe9IWrqqwYgDFBfv6sk76I1yaQ==", "dev": true, - "requires": { - "prelude-ls": "^1.2.1" + "dependencies": { + "workbox-core": "7.0.0" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/workbox-recipes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.0.0.tgz", + "integrity": "sha512-DntcK9wuG3rYQOONWC0PejxYYIDHyWWZB/ueTbOUDQgefaeIj1kJ7pdP3LZV2lfrj8XXXBWt+JDRSw1lLLOnww==", "dev": true, - "requires": { - "is-typedarray": "^1.0.0" + "dependencies": { + "workbox-cacheable-response": "7.0.0", + "workbox-core": "7.0.0", + "workbox-expiration": "7.0.0", + "workbox-precaching": "7.0.0", + "workbox-routing": "7.0.0", + "workbox-strategies": "7.0.0" } }, - "typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", - "devOptional": true, - "peer": true - }, - "typeson": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/typeson/-/typeson-6.1.0.tgz", - "integrity": "sha512-6FTtyGr8ldU0pfbvW/eOZrEtEkczHRUtduBnA90Jh9kMPCiFNnXIon3vF41N0S4tV1HHQt4Hk1j4srpESziCaA==", - "dev": true - }, - "typeson-registry": { - "version": "1.0.0-alpha.39", - "resolved": "https://registry.npmjs.org/typeson-registry/-/typeson-registry-1.0.0-alpha.39.tgz", - "integrity": "sha512-NeGDEquhw+yfwNhguLPcZ9Oj0fzbADiX4R0WxvoY8nGhy98IbzQy1sezjoEFWOywOboj/DWehI+/aUlRVrJnnw==", + "node_modules/workbox-routing": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.0.0.tgz", + "integrity": "sha512-8YxLr3xvqidnbVeGyRGkaV4YdlKkn5qZ1LfEePW3dq+ydE73hUUJJuLmGEykW3fMX8x8mNdL0XrWgotcuZjIvA==", "dev": true, - "requires": { - "base64-arraybuffer-es6": "^0.7.0", - "typeson": "^6.0.0", - "whatwg-url": "^8.4.0" + "dependencies": { + "workbox-core": "7.0.0" } }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" - }, - "ua-parser-js": { - "version": "0.7.31", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", - "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==" - }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" - }, - "uglify-js": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.16.3.tgz", - "integrity": "sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==", + "node_modules/workbox-strategies": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.0.0.tgz", + "integrity": "sha512-dg3qJU7tR/Gcd/XXOOo7x9QoCI9nk74JopaJaYAQ+ugLi57gPsXycVdBnYbayVj34m6Y8ppPwIuecrzkpBVwbA==", "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "dependencies": { + "workbox-core": "7.0.0" } }, - "unhomoglyph": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/unhomoglyph/-/unhomoglyph-1.0.6.tgz", - "integrity": "sha512-7uvcWI3hWshSADBu4JpnyYbTVc7YlhF5GDW/oPD5AxIxl34k4wXR3WDkPnzLxkN32LiTCTKMQLtKVZiwki3zGg==" + "node_modules/workbox-streams": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.0.0.tgz", + "integrity": "sha512-moVsh+5to//l6IERWceYKGiftc+prNnqOp2sgALJJFbnNVpTXzKISlTIsrWY+ogMqt+x1oMazIdHj25kBSq/HQ==", + "dev": true, + "dependencies": { + "workbox-core": "7.0.0", + "workbox-routing": "7.0.0" + } }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/workbox-sw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.0.0.tgz", + "integrity": "sha512-SWfEouQfjRiZ7GNABzHUKUyj8pCoe+RwjfOIajcx6J5mtgKkN+t8UToHnpaJL5UVVOf5YhJh+OHhbVNIHe+LVA==", "dev": true }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/workbox-window": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.0.0.tgz", + "integrity": "sha512-j7P/bsAWE/a7sxqTzXo3P2ALb1reTfZdvVp6OJ/uLr/C2kZAMvjeWGm8V4htQhor7DOvYg0sSbFN2+flT5U0qA==", "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.0.0" } }, - "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "node_modules/workerpool": { + "version": "6.2.0", + "dev": true, + "license": "Apache-2.0" }, - "unified": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", - "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", - "requires": { - "@types/unist": "^2.0.0", - "bail": "^2.0.0", - "extend": "^3.0.0", - "is-buffer": "^2.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^5.0.0" + "node_modules/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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - }, - "is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==" - } + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", "dev": true, - "requires": { - "unique-slug": "^2.0.0" + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } + "license": "MIT" }, - "unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "node_modules/wrappy": { + "version": "1.0.2", "dev": true, - "requires": { - "crypto-random-string": "^4.0.0" - } - }, - "unist-util-is": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.1.1.tgz", - "integrity": "sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==" - }, - "unist-util-stringify-position": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.2.tgz", - "integrity": "sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==", - "requires": { - "@types/unist": "^2.0.0" - } + "license": "ISC" }, - "unist-util-visit": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.1.tgz", - "integrity": "sha512-n9KN3WV9k4h1DxYR1LoajgN93wpEi/7ZplVe02IoB4gH5ctI1AaF2670BLHQYbwj+pY83gFtyeySFiyMHJklrg==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" + "node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "unist-util-visit-parents": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.1.tgz", - "integrity": "sha512-gks4baapT/kNRaWxuGkl5BIhoanZo7sC/cUT/JToSRNL1dYoXRFl75d++NkjYk4TAu2uv2Px+l8guMajogeuiw==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "universal-user-agent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", - "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" - }, - "unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", - "dev": true - }, - "upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "node_modules/ws": { + "version": "7.5.9", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" } }, - "url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "node_modules/xmlchars": { + "version": "2.2.0", "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } + "license": "MIT" }, - "use-callback-ref": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", - "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", - "requires": { - "tslib": "^2.0.0" + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4" } }, - "use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "requires": {} - }, - "use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "requires": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" + "node_modules/y-indexeddb": { + "version": "9.0.6", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.35" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" + "node_modules/y-leveldb": { + "version": "0.1.2", + "license": "MIT", + "optional": true, + "dependencies": { + "level": "^6.0.1", + "lib0": "^0.2.31" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" } }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "requires": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" + "node_modules/y-prosemirror": { + "version": "1.0.20", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.42" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "prosemirror-model": "^1.7.1", + "prosemirror-state": "^1.2.3", + "prosemirror-view": "^1.9.10", + "y-protocols": "^1.0.1", + "yjs": "^13.3.2" } }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "node_modules/y-protocols": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.42" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" } }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node_modules/y-websocket": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.52", + "lodash.debounce": "^4.0.8", + "y-protocols": "^1.0.5" + }, + "bin": { + "y-websocket": "bin/server.js", + "y-websocket-server": "bin/server.js" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "optionalDependencies": { + "ws": "^6.2.1", + "y-leveldb": "^0.1.0" + }, + "peerDependencies": { + "yjs": "^13.5.6" } }, - "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "requires": { - "builtins": "^5.0.0" + "node_modules/y-websocket/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "optional": true, + "dependencies": { + "async-limiter": "~1.0.0" } }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - } + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" } }, - "vfile": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.4.tgz", - "integrity": "sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw==", - "requires": { - "@types/unist": "^2.0.0", - "is-buffer": "^2.0.0", - "unist-util-stringify-position": "^3.0.0", - "vfile-message": "^3.0.0" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" - } + "node_modules/yaeti": { + "version": "0.0.6", + "license": "MIT", + "engines": { + "node": ">=0.10.32" } }, - "vfile-message": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.2.tgz", - "integrity": "sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==", - "requires": { - "@types/unist": "^2.0.0", - "unist-util-stringify-position": "^3.0.0" - } + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" }, - "vite": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.9.tgz", - "integrity": "sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==", - "dev": true, - "requires": { - "esbuild": "^0.14.47", - "fsevents": "~2.3.2", - "postcss": "^8.4.16", - "resolve": "^1.22.1", - "rollup": ">=2.75.6 <2.77.0 || ~2.77.0" - }, - "dependencies": { - "@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "requires": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "dev": true, - "optional": true - }, - "rollup": { - "version": "2.77.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.3.tgz", - "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - } + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" } }, - "vitest": { - "version": "0.24.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.24.4.tgz", - "integrity": "sha512-4ratHSyVEJPtBLV00uhL4Wj3Pmandc9rsxUkE0q9peNOfaOgGF4lEepdkaXGRi9AGFKr1GRVtjGOJ6Fp2lCpEg==", + "node_modules/yargs": { + "version": "16.2.0", "dev": true, - "requires": { - "@types/chai": "^4.3.3", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "chai": "^4.3.6", - "debug": "^4.3.4", - "local-pkg": "^0.4.2", - "strip-literal": "^0.4.2", - "tinybench": "^2.3.1", - "tinypool": "^0.3.0", - "tinyspy": "^1.0.2", - "vite": "^3.0.0" + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "vscode-lib": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/vscode-lib/-/vscode-lib-0.1.2.tgz", - "integrity": "sha512-X7YTInfdx0D7O5d5jxv5tirYNlZT3wwmB/auEWDq8nKrJCkZea48y1brADKWSfmmSCvmaZwG5RJ3VOQf/pPwMg==" - }, - "w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "node_modules/yargs-parser": { + "version": "20.2.4", "dev": true, - "requires": { - "browser-process-hrtime": "^1.0.0" + "license": "ISC", + "engines": { + "node": ">=10" } }, - "w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" - }, - "w3c-xmlserializer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", - "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "node_modules/yargs-unparser": { + "version": "2.0.0", "dev": true, - "requires": { - "xml-name-validator": "^4.0.0" + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" } }, - "walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "requires": { - "loose-envify": "^1.0.0" + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "wasm-dce": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wasm-dce/-/wasm-dce-1.0.2.tgz", - "integrity": "sha512-Fq1+nu43ybsjSnBquLrW/cULmKs61qbv9k8ep13QUe0nABBezMoNAA+j6QY66MW0/eoDVDp1rjXDqQ2VKyS/Xg==", - "requires": { - "@babel/core": "^7.0.0-beta.39", - "@babel/traverse": "^7.0.0-beta.39", - "@babel/types": "^7.0.0-beta.39", - "babylon": "^7.0.0-beta.39", - "webassembly-interpreter": "0.0.30" + "node_modules/yjs": { + "version": "13.6.7", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.74" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" } }, - "wasm-loader": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/wasm-loader/-/wasm-loader-1.3.0.tgz", - "integrity": "sha512-R4s75XH+o8qM+WaRrAU9S2rbAMDzob18/S3V8R9ZoFpZkPWLAohWWlzWAp1ybeTkOuuku/X1zJtxiV0pBYxZww==", - "requires": { - "loader-utils": "^1.1.0", - "wasm-dce": "^1.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "web-vitals": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-1.1.2.tgz", - "integrity": "sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==" + "packages/editor": { + "name": "@typecell-org/editor", + "version": "0.0.3", + "dependencies": { + "@atlaskit/atlassian-navigation": "^2.6.13", + "@atlaskit/avatar": "^21.3.7", + "@atlaskit/breadcrumbs": "^11.10.5", + "@atlaskit/button": "^16.8.2", + "@atlaskit/css-reset": "^6.5.3", + "@atlaskit/dropdown-menu": "^11.10.5", + "@atlaskit/empty-state": "^7.6.3", + "@atlaskit/flag": "^15.2.15", + "@atlaskit/form": "^8.11.8", + "@atlaskit/inline-message": "^11.5.3", + "@atlaskit/menu": "^1.9.5", + "@atlaskit/modal-dialog": "^12.6.3", + "@atlaskit/page-header": "^10.4.4", + "@atlaskit/page-layout": "^1.7.7", + "@atlaskit/section-message": "^6.4.10", + "@atlaskit/select": "^16.5.7", + "@atlaskit/spinner": "^15.5.3", + "@atlaskit/textarea": "^4.7.4", + "@atlaskit/textfield": "^5.6.3", + "@atlaskit/tree": "^8.8.5", + "@blocknote/core": "^0.9.2", + "@emotion/react": "^11.4.0", + "@hocuspocus/provider": "^2.4.0", + "@supabase/auth-ui-react": "^0.4.2", + "@supabase/auth-ui-shared": "^0.1.6", + "@supabase/supabase-js": "^2.26.0", + "@syncedstore/yjs-reactive-bindings": "^0.5.1", + "@tiptap/core": "^2.0.4", + "@typecell-org/engine": "^0.0.3", + "@typecell-org/frame": "^0.0.3", + "@typecell-org/parsers": "^0.0.3", + "@typecell-org/shared": "^0.0.3", + "@typecell-org/util": "^0.0.3", + "classnames": "^2.3.1", + "fractional-indexing": "^2.0.0", + "lodash": "^4.17.21", + "mobx": "^6.2.0", + "mobx-react-lite": "^3.2.0", + "penpal": "^6.1.0", + "react": "^18.2.0", + "react-avatar": "^3.10.0", + "react-dnd": "^14.0.2", + "react-dnd-html5-backend": "^14.0.0", + "react-dom": "^18.2.0", + "react-error-overlay": "^6.0.9", + "react-icons": "^4.6.0", + "react-router-dom": "^6.10.0", + "speakingurl": "^14.0.1", + "vscode-lib": "^0.1.2", + "web-vitals": "^1.0.1", + "y-indexeddb": "9.0.6", + "y-protocols": "^1.0.5", + "y-websocket": "^1.5.0", + "yjs": "^13.6.4" + }, + "devDependencies": { + "@playwright/experimental-ct-react": "^1.33.0", + "@playwright/test": "^1.33.0", + "@typecell-org/shared-test": "^0.0.3", + "@types/lodash": "^4.14.168", + "@types/node": "^16.0.0", + "@types/react": "^18.0.25", + "@types/react-dom": "^18.0.9", + "@types/speakingurl": "^13.0.2", + "@vitejs/plugin-react": "^4.0.0", + "chai": "^4.3.7", + "connect-history-api-fallback": "^2.0.0", + "cross-env": "^7.0.3", + "eslint": "^8.21.0", + "glob": "^7.2.0", + "jsdom": "^20.0.0", + "playwright-test": "^11.0.4", + "rimraf": "^3.0.2", + "rollup-plugin-polyfill-node": "^0.12.0", + "rollup-plugin-webpack-stats": "^0.2.0", + "vite": "^4.4.2", + "vite-plugin-pwa": "^0.16.4", + "vitest": "^0.33.0", + "workbox-core": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-window": "^7.0.0" + } }, - "webassembly-floating-point-hex-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/webassembly-floating-point-hex-parser/-/webassembly-floating-point-hex-parser-0.1.2.tgz", - "integrity": "sha512-TUf1H++8U10+stJbFydnvrpG5Sznz5Rilez/oZlV5zI0C/e4cSxd8rALAJ8VpTvjVWxLmL3SVSJUK6Ap9AoiNg==" + "packages/editor/node_modules/@types/node": { + "version": "16.18.41", + "dev": true, + "license": "MIT" }, - "webassembly-interpreter": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/webassembly-interpreter/-/webassembly-interpreter-0.0.30.tgz", - "integrity": "sha512-+Jdy2piEvz9T5j751mOE8+rBO12p+nNW6Fg4kJZ+zP1oUfsm+151sbAbM8AFxWTURmWCGP+r8Lxwfv3pzN1bCQ==", - "requires": { - "@babel/code-frame": "^7.0.0-beta.36", - "long": "^3.2.0", - "webassembly-floating-point-hex-parser": "0.1.2" + "packages/engine": { + "name": "@typecell-org/engine", + "version": "0.0.3", + "dependencies": { + "@typecell-org/shared": "*", + "es-module-shims": "1.4.3", + "lodash": "^4.17.21", + "mobx": "^6.2.0", + "react": "^18.2.0", + "vscode-lib": "^0.1.2" + }, + "devDependencies": { + "@playwright/test": "^1.33.0", + "@types/chai": "^4.3.0", + "@types/lodash": "^4.14.182", + "@types/mocha": "^9.1.0", + "@types/react": "^18.0.25", + "@vitest/coverage-v8": "^0.33.0", + "chai": "^4.3.6", + "jsdom": "^22.1.0", + "mocha": "^9.2.1", + "playwright-test": "^11.0.4", + "rimraf": "^3.0.2", + "typescript": "5.0.4", + "vitest": "^0.33.0" } }, - "webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "dev": true + "packages/engine/node_modules/cssstyle": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } }, - "whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "packages/engine/node_modules/data-urls": { + "version": "4.0.0", "dev": true, - "requires": { - "iconv-lite": "0.6.3" + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" }, + "engines": { + "node": ">=14" + } + }, + "packages/engine/node_modules/jsdom": { + "version": "22.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "whatwg-fetch": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", - "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" - }, - "whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true - }, - "whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "packages/engine/node_modules/tr46": { + "version": "4.1.1", "dev": true, - "requires": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "packages/engine/node_modules/whatwg-url": { + "version": "12.0.1", "dev": true, - "requires": { - "isexe": "^2.0.0" + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "packages/engine/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "packages/frame": { + "name": "@typecell-org/frame", + "version": "0.0.3", + "dependencies": { + "@blocknote/core": "^0.9.2", + "@blocknote/react": "^0.9.2", + "@floating-ui/react": "^0.25.1", + "@syncedstore/yjs-reactive-bindings": "^0.5.1", + "@tiptap/core": "^2.0.4", + "@tiptap/react": "^2.0.4", + "@typecell-org/engine": "^0.0.3", + "@typecell-org/shared": "^0.0.3", + "@typecell-org/util": "^0.0.3", + "localforage": "^1.10.0", + "lz-string": "^1.4.4", + "markdown-it": "^12.0.2", + "mobx": "^6.2.0", + "mobx-react-lite": "^3.2.0", + "monaco-editor": "^0.35.0", + "penpal": "^6.1.0", + "prettier": "^3.0.2", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.19.3", + "prosemirror-state": "^1.4.3", + "prosemirror-view": "^1.31.7", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.6.0", + "react-inspector": "^6.0.1", + "typescript": "5.0.4", + "vscode-lib": "^0.1.2", + "y-protocols": "^1.0.5", + "y-websocket": "^1.5.0", + "yjs": "^13.6.4" + }, + "devDependencies": { + "@playwright/test": "^1.33.0", + "@types/markdown-it": "^10.0.3", + "@types/prettier": "^3.0.0", + "@vitejs/plugin-react": "^4.0.0", + "@vitest/coverage-v8": "^0.33.0", + "chai": "^4.3.7", + "cross-fetch": "^4.0.0", + "jsdom": "^22.1.0", + "playwright-test": "^11.0.4", + "typescript": "5.0.4", + "vitest": "^0.33.0" + } + }, + "packages/frame/node_modules/cssstyle": { + "version": "3.0.0", "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" } }, - "which-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", - "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", + "packages/frame/node_modules/data-urls": { + "version": "4.0.0", "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.20.0", - "for-each": "^0.3.3", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.9" + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" } }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "packages/frame/node_modules/jsdom": { + "version": "22.1.0", "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, + "license": "MIT", "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true } } }, - "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "packages/frame/node_modules/tr46": { + "version": "4.1.1", "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" } }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz", - "integrity": "sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==", + "packages/frame/node_modules/whatwg-url": { + "version": "12.0.1", "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" } }, - "write-json-file": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz", - "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==", - "dev": true, - "requires": { - "detect-indent": "^6.0.0", - "graceful-fs": "^4.1.15", - "is-plain-obj": "^2.0.0", - "make-dir": "^3.0.0", - "sort-keys": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "dependencies": { - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "packages/frame/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } + "utf-8-validate": { + "optional": true } } }, - "write-pkg": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", - "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", - "dev": true, - "requires": { - "sort-keys": "^2.0.0", - "type-fest": "^0.4.1", - "write-json-file": "^3.2.0" - }, + "packages/parsers": { + "name": "@typecell-org/parsers", + "version": "0.0.3", "dependencies": { - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "requires": { - "is-plain-obj": "^1.0.0" - } - }, - "type-fest": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", - "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", - "dev": true - }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "write-json-file": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", - "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", - "dev": true, - "requires": { - "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.15", - "make-dir": "^2.1.0", - "pify": "^4.0.1", - "sort-keys": "^2.0.0", - "write-file-atomic": "^2.4.2" - } - } + "@typecell-org/engine": "*", + "@typecell-org/util": "*", + "fs-extra": "^10.1.0", + "remark-parse": "^10.0.1", + "remark-stringify": "^10.0.2", + "unified": "^10.0.1", + "vscode-lib": "^0.1.2" + }, + "devDependencies": { + "@playwright/test": "^1.33.0", + "@types/fs-extra": "9.0.13", + "@types/react": "^18.0.25", + "@vitest/coverage-v8": "^0.33.0", + "fast-glob": "^3.2.12", + "jsdom": "^22.1.0", + "playwright-test": "^11.0.4", + "rimraf": "^3.0.2", + "typescript": "5.0.4", + "vitest": "^0.33.0" } }, - "ws": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", - "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "packages/parsers/node_modules/cssstyle": { + "version": "3.0.0", "dev": true, - "requires": {} + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.6.0" + }, + "engines": { + "node": ">=14" + } }, - "xml-name-validator": { + "packages/parsers/node_modules/data-urls": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true - }, - "xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y-indexeddb": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.6.tgz", - "integrity": "sha512-8mdCYdzZDWS2lGiB9Reaz67ZqvnV6EXH/F7L+TmBC+3mWjIBrPw4UcI79nOhEOh+y9lHXzNpSda4YJ06M13F1A==", - "requires": { - "lib0": "^0.2.35" + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.0" + }, + "engines": { + "node": ">=14" } }, - "y-monaco": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/y-monaco/-/y-monaco-0.1.4.tgz", - "integrity": "sha512-RzAvjKJ2yt3VjlKK55U8STJyd1gz5/Qm6pjt7SAVb+k+g+KaSeTuSBGt+lURN+dzzSNs73ZkIAerW3JM0mzBSw==", - "requires": { - "lib0": "^0.2.43" + "packages/parsers/node_modules/jsdom": { + "version": "22.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "cssstyle": "^3.0.0", + "data-urls": "^4.0.0", + "decimal.js": "^10.4.3", + "domexception": "^4.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.4", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.6.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^12.0.1", + "ws": "^8.13.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } } }, - "y-prosemirror": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/y-prosemirror/-/y-prosemirror-1.0.20.tgz", - "integrity": "sha512-LVMtu3qWo0emeYiP+0jgNcvZkqhzE/otOoro+87q0iVKxy/sMKuiJZnokfJdR4cn9qKx0Un5fIxXqbAlR2bFkA==", - "requires": { - "lib0": "^0.2.42" + "packages/parsers/node_modules/tr46": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" } }, - "y-protocols": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.5.tgz", - "integrity": "sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==", - "requires": { - "lib0": "^0.2.42" + "packages/parsers/node_modules/whatwg-url": { + "version": "12.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=14" } }, - "y-webrtc": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.3.tgz", - "integrity": "sha512-X7a6c56/jWhEI8LHLmT3LgzwbPA4r8h46pdVvV+55EQJhi+K6RfmisWgj7h6/2gkB0yveq7iDxlmyrYGnAKW/Q==", - "requires": { - "lib0": "^0.2.42", - "simple-peer": "^9.11.0", - "ws": "^7.2.0", - "y-protocols": "^1.0.5" + "packages/parsers/node_modules/ws": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, - "dependencies": { - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "optional": true, - "requires": {} + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true } } }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "packages/server": { + "name": "@typecell-org/server", + "version": "0.0.3", + "dependencies": { + "@hocuspocus/extension-database": "^2.4.0", + "@hocuspocus/extension-logger": "^2.4.0", + "@hocuspocus/server": "^2.4.0", + "@supabase/supabase-js": "^2.12.1", + "@typecell-org/shared": "^0.0.3", + "@typecell-org/shared-test": "^0.0.3", + "@typecell-org/util": "^0.0.3", + "dotenv": "^16.3.1", + "vscode-lib": "^0.1.2" + }, + "devDependencies": { + "@hocuspocus/provider": "^2.4.0", + "@playwright/test": "^1.33.0", + "@vitest/coverage-v8": "^0.33.0", + "jsdom": "^20.0.0", + "playwright-test": "^11.0.4", + "supabase": "^1.75.3", + "typescript": "5.0.4", + "vite-node": "^0.33.0", + "vitest": "^0.33.0", + "ws": "^8.13.0", + "yjs": "^13.6.4" } }, - "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true - }, - "yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "packages/server/node_modules/ws": { + "version": "8.13.0", "dev": true, - "requires": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "license": "MIT", + "engines": { + "node": ">=10.0.0" }, - "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true + "utf-8-validate": { + "optional": true } } }, - "yjs": { - "version": "13.5.41", - "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.41.tgz", - "integrity": "sha512-4eSTrrs8OeI0heXKKioRY4ag7V5Bk85Z4MeniUyown3o3y0G7G4JpAZWrZWfTp7pzw2b53GkAQWKqHsHi9j9JA==", - "requires": { - "lib0": "^0.2.49" + "packages/shared": { + "name": "@typecell-org/shared", + "version": "0.0.3", + "dependencies": { + "@typecell-org/util": "^0.0.3", + "vscode-lib": "^0.1.2" + }, + "devDependencies": { + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "eslint": "^8.21.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-import": "^2.28.0", + "typescript": "5.0.4" } }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "packages/shared-test": { + "name": "@typecell-org/shared-test", + "version": "0.0.3", + "devDependencies": { + "@hocuspocus/provider": "^2.4.0", + "@supabase/supabase-js": "^2.12.1", + "@typecell-org/shared": "*", + "@typecell-org/util": "*", + "typescript": "5.0.4", + "yjs": "^13.6.4" + } }, - "zwitch": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.2.tgz", - "integrity": "sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==" + "packages/util": { + "name": "@typecell-org/util", + "version": "0.0.3", + "dependencies": { + "buffer": "^6.0.3", + "nanoid": "^4.0.1", + "react": "^18.2.0", + "string.prototype.replaceall": "^1.0.5", + "uuid": "^8.3.2" + }, + "devDependencies": { + "@types/uuid": "^8.3.4", + "rimraf": "^3.0.2", + "typescript": "5.0.4" + }, + "peerDependencies": { + "react": "17 || 18" + } }, - "zxcvbn": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz", - "integrity": "sha512-Bq0B+ixT/DMyG8kgX2xWcI5jUvCwqrMxSFam7m0lAf78nf04hv6lNCsyLYdyYTrCVMqNDY/206K7eExYCeSyUQ==" + "packages/util/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } } } } diff --git a/package.json b/package.json index c2f0050cb..afd615f62 100644 --- a/package.json +++ b/package.json @@ -3,41 +3,47 @@ "private": true, "license": "AGPL-3.0", "devDependencies": { - "lerna": "^5.0.0", - "playwright": "^1.18.1", - "patch-package": "^6.4.7", + "@playwright/experimental-ct-react": "^1.33.0", "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9" + "@types/react-dom": "^18.0.9", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "patch-package": "^7.0.0", + "playwright": "^1.33.0" }, "workspaces": [ - "packages/*" + "packages/util", + "packages/shared", + "packages/shared-test", + "packages/engine", + "packages/parsers", + "packages/frame", + "packages/editor", + "packages/server" ], "scripts": { "patch-package": "patch-package", "postinstall": "patch-package", - "playwright:dev": "lerna run playwright:dev --stream", - "playwright:preview": "lerna run playwright:preview --stream", + "playwright:dev": "npm run playwright:dev --workspaces", + "playwright:preview": "npm run playwright:preview --workspaces", "install-playwright": "npx playwright install --with-deps", - "test": "lerna run test --concurrency 1 --stream", - "unittest:vitest": "lerna run unittest:vitest --concurrency 1 --stream", + "test": "npm run test --workspaces", + "unittest:vitest": "npm run unittest:vitest --workspaces", "wip:unittest:vitest:coverage": "vitest run --coverage -r packages/xxx", - "build": "lerna run build --concurrency 1", - "build:react": "lerna run build:react --concurrency 1 --stream", - "lint": "lerna run lint --concurrency 1 --stream", - "watch": "npm run build && lerna run --parallel watch", + "build": "npm run build --workspaces", + "build:react": "npm run build:react --workspace=packages/editor", + "lint": "npm run lint --workspaces", + "watch": "npm run build && npm run --parallel watch", "start": "npm run start-react", - "start-filebridge": "npx filebridge docs", - "start-react": "lerna run --scope @typecell-org/editor start --stream", - "start:local": "lerna run --scope @typecell-org/editor start:local --stream", - "start:preview": "lerna run --scope @typecell-org/editor preview --stream", - "prepublishOnly": "npm run test && npm run build", - "deploy": "lerna publish", - "link-matrix-crdt": "npm link matrix-crdt" + "start-react": "npm run start --workspace=packages/editor", + "start:preview": "npm run preview --workspace=packages/editor", + "start:server": "npm run dev --workspace=packages/server", + "prepublishOnly": "npm run test && npm run build" }, "overrides": { - "--comment": "needed so that playwright-test doesn't install a different version of pw", - "playwright-core": "1.24.2", "@types/react": "^18.0.25", - "@types/react-dom": "^18.0.9" + "@types/react-dom": "^18.0.9", + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/packages/common/package.json b/packages/common/package.json deleted file mode 100644 index aa79b15b2..000000000 --- a/packages/common/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "@typecell-org/common", - "version": "0.0.3", - "private": true, - "dependencies": { - "buffer": "^6.0.3", - "string.prototype.replaceall": "^1.0.5", - "uuid": "^8.3.2" - }, - "devDependencies": { - "rimraf": "^3.0.2", - "typescript": "4.5.5", - "@types/uuid": "^8.3.4", - "rollup-plugin-node-polyfills": "^0.2.1" - }, - "source": "src/index.ts", - "types": "types/index.d.ts", - "main": "dist/index.js", - "type": "module", - "scripts": { - "clean": "rimraf dist && rimraf types", - "build": "npm run clean && tsc -p tsconfig.json", - "watch": "tsc --watch" - } -} diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts deleted file mode 100644 index 0872bb70a..000000000 --- a/packages/common/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as base64 from "./base64.js"; -import * as binary from "./binary.js"; -import * as error from "./error.js"; -import * as uniqueId from "./uniqueId.js"; - -export { base64, uniqueId, binary, error }; diff --git a/packages/common/src/uniqueId.ts b/packages/common/src/uniqueId.ts deleted file mode 100644 index 4c9db4cad..000000000 --- a/packages/common/src/uniqueId.ts +++ /dev/null @@ -1,8 +0,0 @@ -import replaceAll from "string.prototype.replaceall"; -import { v4 as uuidv4 } from "uuid"; -(replaceAll as any).shim(); - -export function generate() { - // remove dashes because we can't easily use those in javascript variable names - return uuidv4().replaceAll("-", ""); -} diff --git a/packages/editor/.env.development b/packages/editor/.env.development new file mode 100644 index 000000000..938738eaa --- /dev/null +++ b/packages/editor/.env.development @@ -0,0 +1,7 @@ +# Note: keep this file in sync with env.ts +VITE_ENVIRONMENT=DEV +VITE_TYPECELL_BACKEND_WS_URL=ws://localhost:1234 +VITE_TYPECELL_SUPABASE_URL=http://localhost:54321 +VITE_TYPECELL_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 +VITE_MATRIX_HOMESERVER_URI=https://mx.typecell.org +VITE_MATRIX_HOMESERVER_NAME=typecell.org \ No newline at end of file diff --git a/packages/editor/.env.production b/packages/editor/.env.production new file mode 100644 index 000000000..4f88be449 --- /dev/null +++ b/packages/editor/.env.production @@ -0,0 +1,6 @@ +VITE_ENVIRONMENT=PROD +VITE_TYPECELL_BACKEND_WS_URL=wss://backend.typecell.org/ +VITE_TYPECELL_SUPABASE_URL=https://guzxrzrjknsekuefovon.supabase.co +VITE_TYPECELL_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imd1enhyenJqa25zZWt1ZWZvdm9uIiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODc0MjIzMDUsImV4cCI6MjAwMjk5ODMwNX0.2ZvW9nvWHSy1BFIBQYBxEysB2VJS761wpPiPmpe5Yqk +VITE_MATRIX_HOMESERVER_URI=https://mx.typecell.org +VITE_MATRIX_HOMESERVER_NAME=typecell.org \ No newline at end of file diff --git a/packages/editor/.env.staging b/packages/editor/.env.staging new file mode 100644 index 000000000..74598b9da --- /dev/null +++ b/packages/editor/.env.staging @@ -0,0 +1,6 @@ +VITE_ENVIRONMENT=STAGING +VITE_TYPECELL_BACKEND_WS_URL=wss://backend.staging.typecell.org/ +VITE_TYPECELL_SUPABASE_URL=https://glsqqdamehahvdqssxow.supabase.co +VITE_TYPECELL_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Imdsc3FxZGFtZWhhaHZkcXNzeG93Iiwicm9sZSI6ImFub24iLCJpYXQiOjE2ODc0MjIzNTksImV4cCI6MjAwMjk5ODM1OX0.Z4_bs6Zcq2MtoKlCK-R_-7MFHOa4NeK_axCgGtLheIY +VITE_MATRIX_HOMESERVER_URI=https://mx.typecell.org +VITE_MATRIX_HOMESERVER_NAME=typecell.org \ No newline at end of file diff --git a/packages/editor/.env.test b/packages/editor/.env.test new file mode 100644 index 000000000..bc86ad45c --- /dev/null +++ b/packages/editor/.env.test @@ -0,0 +1,6 @@ +VITE_ENVIRONMENT=DEV +VITE_TYPECELL_BACKEND_WS_URL=ws://localhost:1234 +VITE_TYPECELL_SUPABASE_URL=http://localhost:54321 +VITE_TYPECELL_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0 +VITE_MATRIX_HOMESERVER_URI=https://mx.typecell.org +VITE_MATRIX_HOMESERVER_NAME=typecell.org \ No newline at end of file diff --git a/packages/editor/.eslintrc.json b/packages/editor/.eslintrc.json deleted file mode 100644 index f298005b8..000000000 --- a/packages/editor/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["react-app", "react-app/jest"] -} diff --git a/packages/editor/.gitignore b/packages/editor/.gitignore index bba769f27..45d337387 100644 --- a/packages/editor/.gitignore +++ b/packages/editor/.gitignore @@ -2,4 +2,5 @@ build # Playwright test-results/ -playwright-report/ \ No newline at end of file +playwright-report/ +playwright/.cache \ No newline at end of file diff --git a/packages/editor/.npmrc b/packages/editor/.npmrc deleted file mode 100644 index 45c69bbe0..000000000 --- a/packages/editor/.npmrc +++ /dev/null @@ -1 +0,0 @@ -@matrix-org:registry=https://gitlab.matrix.org/api/v4/packages/npm/ diff --git a/packages/editor/copy-docs.mjs b/packages/editor/copy-docs.mjs index e3f7e0428..9d2a3fcaa 100644 --- a/packages/editor/copy-docs.mjs +++ b/packages/editor/copy-docs.mjs @@ -2,4 +2,13 @@ import glob from "glob"; import * as path from "path"; const files = glob.sync("**/*.md", { cwd: path.join("public", "_docs") }); -console.log(JSON.stringify(files)); +console.log( + JSON.stringify( + { + title: "Docs", + items: files, + }, + undefined, + 2 + ) +); diff --git a/packages/editor/dev-dist/registerSW.js b/packages/editor/dev-dist/registerSW.js new file mode 100644 index 000000000..fdeaac12c --- /dev/null +++ b/packages/editor/dev-dist/registerSW.js @@ -0,0 +1 @@ +if('serviceWorker' in navigator) navigator.serviceWorker.register('/dev-sw.js?dev-sw', { scope: '/', type: 'module' }) \ No newline at end of file diff --git a/packages/editor/index.html b/packages/editor/index.html index b73fc693f..240703f57 100644 --- a/packages/editor/index.html +++ b/packages/editor/index.html @@ -10,15 +10,10 @@ - - - - TypeCell Notebooks + TypeCell +
diff --git a/packages/editor/package.json b/packages/editor/package.json index 481913f0b..44c029019 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -3,126 +3,88 @@ "version": "0.0.3", "private": true, "dependencies": { - "@atlaskit/atlassian-navigation": "^2.2.6", - "@atlaskit/avatar": "^21.1.1", - "@atlaskit/banner": "^11.6.1", - "@atlaskit/breadcrumbs": "^11.7.3", - "@atlaskit/button": "^16.3.5", - "@atlaskit/checkbox": "^12.3.18", - "@atlaskit/comment": "^10.5.2", - "@atlaskit/css-reset": "^6.3.13", - "@atlaskit/user-picker": "^9.3.1", - "@atlaskit/dropdown-menu": "^11.3.0", - "@atlaskit/flag": "^14.6.3", - "@atlaskit/form": "^8.5.6", - "@atlaskit/inline-message": "^11.3.0", - "@atlaskit/menu": "^1.3.8", - "@atlaskit/modal-dialog": "^12.2.14", - "@atlaskit/page-header": "^10.2.3", - "@atlaskit/page-layout": "^1.2.7", - "@atlaskit/progress-bar": "^0.5.8", - "@atlaskit/section-message": "^6.1.14", - "@atlaskit/spinner": "^15.1.14", - "@atlaskit/select": "^15.7.5", - "@atlaskit/textarea": "^4.3.8", - "@atlaskit/textfield": "^5.1.12", - "@atlaskit/tree": "^8.6.1", - "@tiptap/extension-collaboration": "^2.0.0-beta.38", - "@tiptap/extension-collaboration-cursor": "^2.0.0-beta.37", - "@deck.gl/aggregation-layers": "^8.6.4", - "@deck.gl/core": "^8.6.4", - "@deck.gl/layers": "^8.6.4", - "@deck.gl/react": "^8.6.4", + "@hocuspocus/provider": "^2.4.0", + "@atlaskit/atlassian-navigation": "^2.6.13", + "@atlaskit/avatar": "^21.3.7", + "@atlaskit/breadcrumbs": "^11.10.5", + "@atlaskit/button": "^16.8.2", + "@atlaskit/css-reset": "^6.5.3", + "@atlaskit/dropdown-menu": "^11.10.5", + "@atlaskit/empty-state": "^7.6.3", + "@atlaskit/flag": "^15.2.15", + "@atlaskit/form": "^8.11.8", + "@atlaskit/inline-message": "^11.5.3", + "@atlaskit/menu": "^1.9.5", + "@atlaskit/modal-dialog": "^12.6.3", + "@atlaskit/page-header": "^10.4.4", + "@atlaskit/page-layout": "^1.7.7", + "@atlaskit/section-message": "^6.4.10", + "@atlaskit/select": "^16.5.7", + "@atlaskit/spinner": "^15.5.3", + "@atlaskit/textarea": "^4.7.4", + "@atlaskit/textfield": "^5.6.3", + "@atlaskit/tree": "^8.8.5", + "@tiptap/core": "^2.0.4", + "@blocknote/core": "^0.9.2", "@emotion/react": "^11.4.0", - "@loaders.gl/core": "^3.0.12", - "@loaders.gl/images": "^3.0.12", - "@matrix-org/olm": "3.2.12", - "@syncedstore/yjs-reactive-bindings": "^0.4.0", - "@tippyjs/react": "^4.2.5", - "@typecell-org/parsers": "^0.0.3", - "@typecell-org/common": "^0.0.3", + "@supabase/auth-ui-react": "^0.4.2", + "@supabase/auth-ui-shared": "^0.1.6", + "@supabase/supabase-js": "^2.26.0", + "@syncedstore/yjs-reactive-bindings": "^0.5.1", + "@typecell-org/util": "^0.0.3", + "@typecell-org/shared": "^0.0.3", "@typecell-org/engine": "^0.0.3", - "@typescript/vfs": "^1.3.4", - "@blocknote/core": "^0.1.0", + "@typecell-org/parsers": "^0.0.3", + "@typecell-org/frame": "^0.0.3", + "speakingurl": "^14.0.1", "classnames": "^2.3.1", - "filebridge-client": "^0.1.5", "fractional-indexing": "^2.0.0", - "frontend-collective-react-dnd-scrollzone": "1.0.2", "lodash": "^4.17.21", - "lowlight": "^1.20.0", - "lz-string": "^1.4.4", - "markdown-it": "^12.0.2", - "matrix-crdt": "^0.2.0", - "matrix-js-sdk": "^19.4.0", "mobx": "^6.2.0", "mobx-react-lite": "^3.2.0", - "monaco-editor": "^0.35.0", "penpal": "^6.1.0", - "prettier": "2.4.1", - "probe.gl": "^3.1.4", - "qs": "^6.10.1", "react": "^18.2.0", "react-avatar": "^3.10.0", "react-dnd": "^14.0.2", "react-dnd-html5-backend": "^14.0.0", "react-dom": "^18.2.0", "react-error-overlay": "^6.0.9", - "react-github-btn": "^1.2.1", "react-icons": "^4.6.0", - "react-inspector": "^6.0.1", - "react-intl-next": "npm:react-intl@^5.18.1", - "remixicon-react": "^1.0.0", - "semver": "^7.3.5", - "speakingurl": "^14.0.1", - "simple-peer": "^9.11.1", - "string.prototype.replaceall": "^1.0.5", - "styled-components": "3.2.6", - "tippy.js": "^6.3.1", - "typescript": "4.5.5", - "ua-parser-js": "^0.7.28", - "uuid": "^8.3.2", + "react-router-dom": "^6.10.0", "vscode-lib": "^0.1.2", - "wasm-loader": "^1.3.0", "web-vitals": "^1.0.1", "y-indexeddb": "9.0.6", - "y-monaco": "^0.1.3", - "y-webrtc": "^10.1.8", "y-protocols": "^1.0.5", - "yjs": "^13.5.41", - "zxcvbn": "^4.4.2", - "react-router-dom": "6.2.2", - "events": "^3.3.0" + "y-websocket": "^1.5.0", + "yjs": "^13.6.4" }, "scripts": { - "copytypes:self": "rimraf public/types && tsc --declaration --stripInternal --emitDeclarationOnly --noEmit false --declarationDir public/types/@typecell-org/editor", + "copytypes:self": "tsc --declaration --emitDeclarationOnly --noEmit false --composite false --declarationDir ./public/types/@typecell-org/editor", "copytypes:externaldep": "mkdir -p public/types/$npm_config_pkgname && cp -rf ../../node_modules/$npm_config_pkgname/. public/types/$npm_config_pkgname", - "copytypes:allexternaldeps": "npm run copytypes:externaldep --pkgname=@types/react && npm run copytypes:externaldep --pkgname=@types/scheduler && npm run copytypes:externaldep --pkgname=@types/prop-types", + "copytypes:allexternaldeps": "npm run copytypes:externaldep --pkgname=@types/react && npm run copytypes:externaldep --pkgname=@types/scheduler && npm run copytypes:externaldep --pkgname=@types/prop-types && npm run copytypes:externaldep --pkgname=csstype", "copytypes:dep": "mkdir -p public/types/@typecell-org/$npm_config_pkgname && cp -rf ../$npm_config_pkgname/types/. public/types/@typecell-org/$npm_config_pkgname", - "copytypes:alldeps": "npm run copytypes:dep --pkgname=common && npm run copytypes:dep --pkgname=engine", + "copytypes:alldeps": "npm run copytypes:dep --pkgname=util && npm run copytypes:dep --pkgname=engine && npm run copytypes:dep --pkgname=frame", "copytypes": "npm run copytypes:self && npm run copytypes:alldeps && npm run copytypes:allexternaldeps", "start": "npm run copytypes && npm run vite:dev", - "start:local": "npm run copytypes && cross-env VITE_REACT_APP_HOMESERVER_URI=http://localhost:8888 VITE_REACT_APP_HOMESERVER_NAME=test.typecell.org npm run vite:dev", "copy-docs": "node copy-docs.mjs > public/_docs/index.json", "build": "tsc -v && npm run copytypes && npm run copy-docs", - "build:react": "npm run build && cross-env NODE_OPTIONS=--max_old_space_size=8192 CI=true npm run vite:build", - "build:react:local-preview": "npm run build && cross-env NODE_OPTIONS=--max_old_space_size=8192 VITE_REACT_APP_PREVIEW=true VITE_REACT_APP_HOMESERVER_URI=http://localhost:8888 VITE_REACT_APP_HOMESERVER_NAME=test.typecell.org npm run vite:build", - "build:react:preview": "npm run build && cross-env NODE_OPTIONS=--max_old_space_size=8192 VITE_REACT_APP_PREVIEW=true npm run vite:build", + "build:react": "cross-env NODE_OPTIONS=--max_old_space_size=8192 CI=true npm run vite:build", "install-playwright": "npx playwright install --with-deps", - "playwright:dev": "cross-env TYPECELL_BASE_URL=http://localhost:5173 npx playwright test", + "playwright:dev": "cross-env TYPECELL_BASE_URL=http://localhost:5173 npx playwright test --ui", "playwright:preview": "cross-env TYPECELL_BASE_URL=http://localhost:4173 npx playwright test", "lint": "eslint src", "test-watch": "vitest watch", - "unittest:vitest": "vitest", - "test": "npm run unittest:vitest", + "unittest:vitest": "vitest run", + "unittest:playwright": "playwright-test '**/*.browsertest.ts' --runner mocha", + "test": "npm run unittest:vitest && npm run unittest:playwright", "vite:dev": "vite", - "vite:build": "vite build", + "vite:build": "vite build --mode=$MODE", "vite:preview": "vite preview", - "preview": "npm run build:react:local-preview && npm run vite:preview" + "preview": "npm run vite:preview" }, "eslintConfig": { "extends": [ - "react-app", - "react-app/jest" + "../shared/.eslintrc.cjs" ] }, "browserslist": { @@ -138,35 +100,31 @@ ] }, "devDependencies": { - "@svgr/webpack": "^5.5.0", + "@playwright/test": "^1.33.0", + "@playwright/experimental-ct-react": "^1.33.0", + "@typecell-org/shared-test": "^0.0.3", "@types/lodash": "^4.14.168", - "@types/lowlight": "0.0.2", - "@types/qs": "^6.9.7", - "@types/semver": "^7.3.8", - "@types/speakingurl": "^13.0.2", - "@types/ua-parser-js": "^0.7.36", - "@types/uuid": "^8.3.0", - "@types/zxcvbn": "^4.4.1", - "@types/prettier": "^2.6.4", - "@types/markdown-it": "^10.0.3", "@types/node": "^16.0.0", "@types/react": "^18.0.25", "@types/react-dom": "^18.0.9", + "@types/speakingurl": "^13.0.2", + "@vitejs/plugin-react": "^4.0.0", + "connect-history-api-fallback": "^2.0.0", + "chai": "^4.3.7", "cross-env": "^7.0.3", "eslint": "^8.21.0", - "eslint-config-react-app": "^7.0.1", - "fake-indexeddb": "^3.1.2", "glob": "^7.2.0", - "rimraf": "^3.0.2", - "@playwright/test": "^1.18.1", - "vite": "^3.0.0", - "@vitejs/plugin-react": "^2.0.0", - "vitest": "^0.24.4", "jsdom": "^20.0.0", - "@esbuild-plugins/node-globals-polyfill": "^0.1.1", - "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "rollup-plugin-polyfill-node": "^0.10.2", - "rollup-plugin-node-polyfills": "^0.2.1", - "connect-history-api-fallback": "^2.0.0" + "playwright-test": "^11.0.4", + "rimraf": "^3.0.2", + "rollup-plugin-polyfill-node": "^0.12.0", + "vite": "^4.4.2", + "vitest": "^0.33.0", + "rollup-plugin-webpack-stats": "^0.2.0", + "vite-plugin-pwa": "^0.16.4", + "workbox-core": "^7.0.0", + "workbox-precaching": "^7.0.0", + "workbox-routing": "^7.0.0", + "workbox-window": "^7.0.0" } } diff --git a/packages/editor/playwright.config.ts b/packages/editor/playwright.config.ts index 652ab5be1..a0bfd4339 100644 --- a/packages/editor/playwright.config.ts +++ b/packages/editor/playwright.config.ts @@ -1,12 +1,14 @@ -import type { PlaywrightTestConfig } from "@playwright/test"; +import { defineConfig } from "@playwright/experimental-ct-react"; import { devices } from "@playwright/test"; -import { TestOptions } from "./tests/end-to-end/setup/fixtures"; - /** * See https://playwright.dev/docs/test-configuration. */ -const config: PlaywrightTestConfig = { - testDir: "./tests", +export default defineConfig({ + testMatch: [ + "tests/**/*.@(spec|test).?(m)[jt]s?(x)", + "src/**/*.@(pwctest).?(m)[jt]s?(x)", + ], + testDir: "./", globalSetup: "./tests/end-to-end/setup/globalSetup.ts", /* Maximum time one test can run for. */ timeout: 30 * 1000, @@ -16,7 +18,7 @@ const config: PlaywrightTestConfig = { * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` */ - timeout: 5000, + timeout: 10000, }, /* Fail the build on CI if you accidentally left test.only in the source code. */ @@ -54,17 +56,17 @@ const config: PlaywrightTestConfig = { ...devices["Desktop Chrome"], }, }, - { - name: "chromium no WebRTC", + // { + // name: "chromium no WebRTC", - /* Project-specific settings. */ - use: { - // headless: false, - ...devices["Desktop Chrome"], - disableWebRTC: true, - }, - testMatch: /.*collaboration.*/, - }, + // /* Project-specific settings. */ + // use: { + // // headless: false, + // ...devices["Desktop Chrome"], + // disableWebRTC: true, + // }, + // testMatch: /.*collaboration.*/, + // }, // { // name: "firefox", @@ -119,5 +121,5 @@ const config: PlaywrightTestConfig = { // timeout: 60 * 1000, // port: 3000, // }, -}; -export default config; +}); +// export default config; diff --git a/packages/editor/playwright/index.html b/packages/editor/playwright/index.html new file mode 100644 index 000000000..f626dc1af --- /dev/null +++ b/packages/editor/playwright/index.html @@ -0,0 +1,6 @@ + + +
+ + + diff --git a/packages/editor/playwright/index.ts b/packages/editor/playwright/index.ts new file mode 100644 index 000000000..632ec912d --- /dev/null +++ b/packages/editor/playwright/index.ts @@ -0,0 +1 @@ +// Apply theme here, add anything your component needs at runtime here. diff --git a/packages/editor/public/_docs/README.md b/packages/editor/public/_docs/README.md index 84925c350..a89e1bbbe 100644 --- a/packages/editor/public/_docs/README.md +++ b/packages/editor/public/_docs/README.md @@ -1,4 +1,4 @@ -# Welcome to TypeCell Notebooks +# Welcome to TypeCell Hi there 👋 ! Welcome to the community preview of TypeCell, an experimental _live notebook programming_ environment for the web. diff --git a/packages/editor/public/_docs/demos.md b/packages/editor/public/_docs/demos.md index 6af020abc..19eb5977e 100644 --- a/packages/editor/public/_docs/demos.md +++ b/packages/editor/public/_docs/demos.md @@ -2,12 +2,12 @@ To showcase some of TypeCell's features, explore these demos from our community: -- [Create an interactive map with Leaflet](/@niklas/maps) -- [Interactive character counter using Vega Lite](/@yousef/character-counter) -- [Visualize weather data with two React chart libraries](/@yousef/charts) -- [Explore TypeCell's reactivity with the help of time](/@niklas/time) -- [Connect React file uploader with an API](/@niklas/api) -- [Working with a CSV dataset](/@niklas/csv) +* [Create an interactive map with Leaflet](/@niklas/maps) +* [Interactive character counter using Vega Lite](/@yousef/character-counter) +* [Visualize weather data with two React chart libraries](/@yousef/charts) +* [Explore TypeCell's reactivity with the help of time](/@niklas/time) +* [Connect React file uploader with an API](/@niklas/api) +* [Working with a CSV dataset](/@niklas/csv) ## Built something exciting? diff --git a/packages/editor/public/_docs/index.json b/packages/editor/public/_docs/index.json index 2a2f01efb..cf80d999b 100644 --- a/packages/editor/public/_docs/index.json +++ b/packages/editor/public/_docs/index.json @@ -1 +1,14 @@ -["demos.md","interactive-introduction.md","manual/1. Notebooks and cells.md","manual/2. TypeScript and exports.md","manual/3. Reactive variables.md","manual/4. Inputs.md","manual/5. Imports and NPM.md","manual/6. Collaboration.md","README.md"] +{ + "title": "Docs", + "items": [ + "demos.md", + "interactive-introduction.md", + "manual/1. Notebooks and cells.md", + "manual/2. TypeScript and exports.md", + "manual/3. Reactive variables.md", + "manual/4. Inputs.md", + "manual/5. Imports and NPM.md", + "manual/6. Collaboration.md", + "README.md" + ] +} diff --git a/packages/editor/public/_docs/interactive-introduction.md b/packages/editor/public/_docs/interactive-introduction.md index 211d5dfc0..330981ed2 100644 --- a/packages/editor/public/_docs/interactive-introduction.md +++ b/packages/editor/public/_docs/interactive-introduction.md @@ -1,9 +1,9 @@ -# Introduction to TypeCell Notebooks +# Introduction to TypeCell -Welcome to TypeCell Notebooks. A notebook is a live, interactive programming environment for Javascript / Typescript +Welcome to TypeCell. A TypeCell document is a live, interactive programming environment for Javascript / Typescript running in your browser. -In this introduction, we will go through the basics of using TypeCell Notebooks. +In this introduction, we will go through the basics of using TypeCell. ## Cats @@ -279,15 +279,11 @@ export default wetFoodMessage; // Setting displayed message for having prepared enough food. export let finalMessage = $.dryFoodRemaining >= 0 && $.wetFoodRemaining >= 0 ? ( -

- ✅ Great job, you fed all the neighborhood cats! -

+ ✅ Great job, you fed all the neighborhood cats! ) : ( -

- - ❌ Looks like we need more food! Some cats are still hungry... - -

+ + ❌ Looks like we need more food! Some cats are still hungry... + ); export default ( @@ -313,6 +309,6 @@ There are a lot more features to discover, for example, did you know you can import any NPM package you like, or even compose different notebooks? Try creating your own notebook to give it a try, or have a look at the other examples. -**Have fun using TypeCell Notebooks!** +**Have fun using TypeCell!** This tutorial is inspired by [pluto.jl](https://github.com/fonsp/Pluto.jl), thanks Fons & Nicholas! diff --git a/packages/editor/public/_docs/manual/1. Notebooks and cells.md b/packages/editor/public/_docs/manual/1. Notebooks and cells.md index a8fc8e1da..8f4bebddf 100644 --- a/packages/editor/public/_docs/manual/1. Notebooks and cells.md +++ b/packages/editor/public/_docs/manual/1. Notebooks and cells.md @@ -1,7 +1,7 @@ # Notebooks and Cells -The page you're looking at is called a *notebook*. -It's basically an interactive document that mixes *code* and *text* (documentation). +The page you're looking at is called a _notebook_. +It's basically an interactive document that mixes _code_ and _text_ (documentation). ## Creating and reordering cells @@ -24,24 +24,24 @@ Useful for writing text / documentation. Markdown cells are collapsed by default Use CSS to easily style the output of other cells (those written in Markdown or TypeScript). - ```css .redText { color: red; } - ``` -
This text is red, styled by the CSS cell above.
+```typescript +export default ( +
This text is red, styled by the CSS cell above.
+); +```` ### TypeScript / JavaScript - ```typescript export let message = "This is a TypeScript cell"; - ``` -TypeScript cells execute automatically as you type.Try editing the`message` above. +TypeScript cells execute automatically as you type. Try editing the `message` above. You've learned the basics! Continue to learn more about writing code using TypeScript cells. diff --git a/packages/editor/public/_docs/manual/2. TypeScript and exports.md b/packages/editor/public/_docs/manual/2. TypeScript and exports.md index f27b02b89..9de5f037b 100644 --- a/packages/editor/public/_docs/manual/2. TypeScript and exports.md +++ b/packages/editor/public/_docs/manual/2. TypeScript and exports.md @@ -1,6 +1,6 @@ # TypeScript and exports -TypeScript cells are the main way to write code in TypeCell Notebooks. +TypeScript cells are the main way to write code in TypeCell. You'll get all the benefits of the [Monaco Editor](https://microsoft.github.io/monaco-editor/) while writing code, the same editor that powers VS Code! @@ -11,27 +11,23 @@ This allows you to quickly write and test code, but still get hints about possib In the example below, you'll notice that we get an error because we assign a `number` to a `string` variable, but the code still executes regardless. - ```typescript export let message = "hello"; message = 4; - ``` ## Exports -You can export variables from your code, and they'll show up as *output* of the cell. Above, we've exported a single `message` variable. +You can export variables from your code, and they'll show up as _output_ of the cell. Above, we've exported a single `message` variable. You can also export multiple variables from a cell, and the _inspector_ will help you to view the output: - ```typescript export let firstVariable = "Hello world"; export let vehicle = { color: "red", wheels: 4, }; - ``` ### DOM Elements @@ -42,12 +38,11 @@ You can create and export DOM Elements to display them directly: export let element = document.createElement("button"); element.innerText = "This is a button. Click me!"; element.onclick = () => window.alert("Hello!"); - ``` ### React / JSX -Think direct DOM manipulation is a little too old school for you? TypeCell supports React & JSX to make your life easier: +Think direct DOM manipulation is a little too old school for you? TypeCell supports React & JSX to make your life easier: ```typescript export let reactElement = ( @@ -55,7 +50,6 @@ export let reactElement = ( This is a React Button ); - ``` ## The `default` export @@ -68,11 +62,10 @@ The following cell exports 2 variables, but only one is displayed in the output: export let myNum = 42; export default
The number is: {myNum}
; - ``` Now you might ask; what's the use of exporting `myNum` if you don't see it in the output? This is because exported variables can be reused across cells and notebooks; one of most powerful features of TypeCell! -Continue to learn more about exported variables and Reactivity. \ No newline at end of file +Continue to learn more about exported variables and Reactivity. diff --git a/packages/editor/public/_docs/manual/3. Reactive variables.md b/packages/editor/public/_docs/manual/3. Reactive variables.md index 50633cdac..3209a3184 100644 --- a/packages/editor/public/_docs/manual/3. Reactive variables.md +++ b/packages/editor/public/_docs/manual/3. Reactive variables.md @@ -2,19 +2,17 @@ This is where things get interesting! Your code can reference variables exported by other cells. -Cells in TypeCell Notebooks (re)evaluate when: +Code cells in TypeCell (re)evaluate when: -* The code of the cell changes (i.e.: you're editing the code) -* A variable the cell depends upon updates +- The code of the cell changes (i.e.: you're editing the code) +- A variable the cell depends upon updates ## The `$` variable Exports of cells are available under the `$` variable. Have a look at the example below, and change the `name` variable to your own name. Notice how the greeting in the cell below updates automatically. - ```typescript export let name = "Anonymous coder"; - ``` ```typescript @@ -23,7 +21,6 @@ export let greeting = ( Hello, {$.name}! ); - ``` Tip: type `$.` in a TypeScript cell, and the editor (Intellisense) will display a list of all exported variables you can reference. @@ -31,4 +28,3 @@ export let greeting = ( ## Interactive Tutorial The Reactive model of TypeCell is quite powerful. If you haven't already, follow the [interactive introduction](/docs/interactive-introduction.md) or have a look at the [demos](/docs/demos.md) to get some hands-on experience. - diff --git a/packages/editor/public/_docs/manual/4. Inputs.md b/packages/editor/public/_docs/manual/4. Inputs.md index 900b092cc..733554215 100644 --- a/packages/editor/public/_docs/manual/4. Inputs.md +++ b/packages/editor/public/_docs/manual/4. Inputs.md @@ -22,13 +22,13 @@ export default $.textVariable; ``` - ## Using `typecell.Input` As the pattern above is quite common, we've created an easy **shorthand** for this that supports different kind of input types: ### Text input + ```typescript // The second parameter (default) is optional export let text1 = typecell.Input(, "default text"); @@ -49,6 +49,7 @@ export let length = $.text1.length; ### Radio buttons and checkboxes + ```typescript // Test two Radio inputs part of the same group @@ -92,6 +93,7 @@ export default $.bold; ### Selects and Dropdowns + ```typescript // Select with "multiple" attribute export let selectMultiple = typecell.Input( @@ -128,7 +130,7 @@ export default $.select; ### Numbers & Ranges -You can user _number_ and _range_ input types to allow the user to enter numbers. Make sure to explicitly pass `` to guide the type system that the edited variable is a number. +You can user *number* and *range* input types to allow the user to enter numbers. Make sure to explicitly pass `` to guide the type system that the edited variable is a number. ```typescript diff --git a/packages/editor/public/_docs/manual/5. Imports and NPM.md b/packages/editor/public/_docs/manual/5. Imports and NPM.md index 369be2c8e..3be44edc8 100644 --- a/packages/editor/public/_docs/manual/5. Imports and NPM.md +++ b/packages/editor/public/_docs/manual/5. Imports and NPM.md @@ -1,6 +1,6 @@ # Imports & NPM -TypeCell Notebooks support importing code from NPM, or from other TypeCell notebooks. +TypeCell supports importing code from NPM, or from other TypeCell documents. ## Importing other notebooks @@ -17,12 +17,12 @@ import * as myNotebook from "!@yousef/demo-message"; export default myNotebook.message; ``` -**TypeCell Notebooks are designed to be as "live" as possible**: when you change the code of your imported notebook, +**TypeCell documents are designed to be as "live" as possible**: when you change the code of your imported notebook, the notebook that imports the code will update live, as-you-type. ## NPM -In TypeCell Notebooks, you can also use any library from [NPM](https://www.npmjs.com/). Simply import the library in a TypeScript cell, and we'll try to resolve it (including TypeScript types) automatically. +In TypeCell, you can also use any library from [NPM](https://www.npmjs.com/). Simply import the library in a TypeScript cell, and we'll try to resolve it (including TypeScript types) automatically. ### Example diff --git a/packages/editor/public/index.html b/packages/editor/public/index.html deleted file mode 100644 index a67e6d946..000000000 --- a/packages/editor/public/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - TypeCell Notebooks - - - -
- - - diff --git a/packages/editor/public/manifest.json b/packages/editor/public/manifest.json deleted file mode 100644 index 0f2d59730..000000000 --- a/packages/editor/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "TypeCell", - "name": "TypeCell", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#ffffff", - "background_color": "#ffffff" -} diff --git a/packages/editor/public/android-chrome-192x192.png b/packages/editor/public/pwa-192x192.png similarity index 100% rename from packages/editor/public/android-chrome-192x192.png rename to packages/editor/public/pwa-192x192.png diff --git a/packages/editor/public/android-chrome-512x512.png b/packages/editor/public/pwa-512x512.png similarity index 100% rename from packages/editor/public/android-chrome-512x512.png rename to packages/editor/public/pwa-512x512.png diff --git a/packages/editor/public/site.webmanifest b/packages/editor/public/site.webmanifest deleted file mode 100644 index b20abb7cb..000000000 --- a/packages/editor/public/site.webmanifest +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "short_name": "", - "icons": [ - { - "src": "/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#ffffff", - "background_color": "#ffffff", - "display": "standalone" -} diff --git a/packages/editor/server/.gitignore b/packages/editor/server/.gitignore deleted file mode 100644 index 6320cd248..000000000 --- a/packages/editor/server/.gitignore +++ /dev/null @@ -1 +0,0 @@ -data \ No newline at end of file diff --git a/packages/editor/server/README.md b/packages/editor/server/README.md deleted file mode 100644 index c2bfc905a..000000000 --- a/packages/editor/server/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# setup database - -CREATE DATABASE "synapse" WITH OWNER = "doadmin" LC_COLLATE = 'C' LC_CTYPE='C' TEMPLATE template0; - -# create config files - -`docker-compose run --rm -e SYNAPSE_SERVER_NAME=typecell.org -e SYNAPSE_REPORT_STATS=no synapse generate` - -Modify `homeserver.yaml` - -- Add postgres database -- set enable_registration: true -- set enable_search: false -- set allow_guest_access: true -- set search_all_users: true -- add github / google oidc providers (https://github.com/matrix-org/synapse/blob/master/docs/openid.md) -- set public_baseurl: https://mx.typecell.org -- set registrations_require_3pid to "email" -- Set SMTP server settings (from sendgrid) -- Set notif_from and app_name - -# setup server - -- mount volume on /data -- copy files in /data, set password -- copy docker-compose.yml to ~ directory -- run `docker-compose up -d` -- setup ufw to loadbalancer (TODO) - -# logging - -- chmod homeserver.log? not working yet diff --git a/packages/editor/server/docker-compose.yml b/packages/editor/server/docker-compose.yml deleted file mode 100644 index e76c07a8b..000000000 --- a/packages/editor/server/docker-compose.yml +++ /dev/null @@ -1,63 +0,0 @@ -# This compose file is compatible with Compose itself, it might need some -# adjustments to run properly with stack. - -version: "3" - -services: - synapse: - # build: - # context: ./ - # dockerfile: docker/Dockerfile - image: docker.io/matrixdotorg/synapse:latest - # Since synapse does not retry to connect to the database, restart upon - # failure - restart: unless-stopped - # See the readme for a full documentation of the environment settings - environment: - - SYNAPSE_CONFIG_PATH=/data/homeserver.yaml - volumes: - # You may either store all the files in a local folder - - /data:/data - # .. or you may split this between different storage points - # - ./files:/data - # - /path/to/ssd:/data/uploads - # - /path/to/large_hdd:/data/media - # depends_on: - # - db - # In order to expose Synapse, remove one of the following, you might for - # instance expose the TLS port directly: - ports: - - 8008:8008/tcp - # ... or use a reverse proxy, here is an example for traefik: - # labels: - # # The following lines are valid for Traefik version 1.x: - # - traefik.enable=true - # - traefik.frontend.rule=Host:my.matrix.Host - # - traefik.port=8008 - # # Alternatively, for Traefik version 2.0: - # - traefik.enable=true - # - traefik.http.routers.http-synapse.entryPoints=http - # - traefik.http.routers.http-synapse.rule=Host(`my.matrix.host`) - # - traefik.http.middlewares.https_redirect.redirectscheme.scheme=https - # - traefik.http.middlewares.https_redirect.redirectscheme.permanent=true - # - traefik.http.routers.http-synapse.middlewares=https_redirect - # - traefik.http.routers.https-synapse.entryPoints=https - # - traefik.http.routers.https-synapse.rule=Host(`my.matrix.host`) - # - traefik.http.routers.https-synapse.service=synapse - # - traefik.http.routers.https-synapse.tls=true - # - traefik.http.services.synapse.loadbalancer.server.port=8008 - # - traefik.http.routers.https-synapse.tls.certResolver=le-ssl -# db: -# image: docker.io/postgres:12-alpine -# # Change that password, of course! -# environment: -# - POSTGRES_USER=synapse -# - POSTGRES_PASSWORD=changeme -# # ensure the database gets created correctly -# # https://github.com/matrix-org/synapse/blob/master/docs/postgres.md#set-up-database -# - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C -# volumes: -# # You may store the database tables in a local folder.. -# - ./schemas:/var/lib/postgresql/data -# # .. or store them on some high performance storage for better results -# # - /path/to/ssd/storage:/var/lib/postgresql/data diff --git a/packages/editor/src/@types/env.d.ts b/packages/editor/src/@types/env.d.ts index a7c2305e5..8f45c85a0 100644 --- a/packages/editor/src/@types/env.d.ts +++ b/packages/editor/src/@types/env.d.ts @@ -1,11 +1,13 @@ /// - +/// +/// interface ImportMetaEnv { - readonly PROD: boolean; - readonly DEV: boolean; - readonly VITE_REACT_APP_STAGING: string; - readonly VITE_REACT_APP_HOMESERVER_URI: string; - readonly VITE_REACT_APP_HOMESERVER_NAME: string; + readonly VITE_ENVIRONMENT: "PROD" | "DEV" | "STAGING"; + readonly VITE_TYPECELL_BACKEND_WS_URL: string; + readonly VITE_TYPECELL_SUPABASE_URL: string; + readonly VITE_TYPECELL_SUPABASE_ANON_KEY: string; + readonly VITE_MATRIX_HOMESERVER_URI: string; + readonly VITE_MATRIX_HOMESERVER_NAME: string; // more env variables... } diff --git a/packages/editor/src/@types/thenable.d.ts b/packages/editor/src/@types/thenable.d.ts.bak similarity index 100% rename from packages/editor/src/@types/thenable.d.ts rename to packages/editor/src/@types/thenable.d.ts.bak diff --git a/packages/editor/src/@types/y-monaco.d.ts b/packages/editor/src/@types/y-monaco.d.ts index da51dda5c..699451322 100644 --- a/packages/editor/src/@types/y-monaco.d.ts +++ b/packages/editor/src/@types/y-monaco.d.ts @@ -6,6 +6,7 @@ declare module "y-monaco" { ytext: Y.Text, model: monaco.editor.ITextModel, editors?: Set, + // eslint-disable-next-line @typescript-eslint/no-explicit-any awareness?: any ); destroy(); diff --git a/packages/editor/src/app/App.tsx b/packages/editor/src/app/App.tsx index 333a93a08..d4aa2530e 100644 --- a/packages/editor/src/app/App.tsx +++ b/packages/editor/src/app/App.tsx @@ -1,69 +1,89 @@ import { observer } from "mobx-react-lite"; -import { BrowserRouter, Route, Routes } from "react-router-dom"; -import { getStoreService } from "../store/local/stores"; +import { + BrowserRouter, + Outlet, + Route, + Routes, + useNavigate, +} from "react-router-dom"; +import { SessionStore } from "../store/local/SessionStore"; + +import { navigateRef, setNavigateRef } from "./GlobalNavigateRef"; +import Main from "./main/Main"; import { AILanding } from "./main/components/startscreen/AILanding"; import { StartScreen } from "./main/components/startscreen/StartScreen"; -import Main from "./main/Main"; -import { ValidatedServerConfig } from "./matrix-auth/auth/util/AutoDiscoveryUtils"; import { DocumentRoute } from "./routes/document"; -import { DynamicRoute } from "./routes/dynamic"; -import { Login } from "./routes/login"; -import { ProfileRoute } from "./routes/profile"; -import { Register } from "./routes/register"; +import { SupabaseSessionStore } from "./supabase-auth/SupabaseSessionStore"; +import { supabaseAuthProvider } from "./supabase-auth/supabaseAuthProvider"; + +const Wrapper = observer((props: { sessionStore: SessionStore }) => { + const navigate = useNavigate(); -export const App = observer((props: { config: ValidatedServerConfig }) => { - console.log("app render"); - const { sessionStore } = getStoreService(); - if (sessionStore.user === "loading") { + if (!navigateRef.current) { + setNavigateRef(navigate); + } + + if (!props.sessionStore.isLoaded) { return
Loading
; // } else if (sessionStore.user === "offlineNoUser") { // return
Offline
; } else { + return ; + } +}); + +export const App = observer( + (props: { + authProvider: typeof supabaseAuthProvider; + sessionStore: SessionStore; + }) => { + console.log("app render"); + const { sessionStore } = props; return ( - }> - }> + }> + }> + + }> + + }> + } + /> + } + /> + + + Not implemented yet} /> }> - }> - } /> - } /> + path="/login" + element={props.authProvider.routes.login( + sessionStore as SupabaseSessionStore + )} + /> + {props.authProvider.routes.additionalRoutes( + sessionStore as SupabaseSessionStore + )} + {/* todo: notfound? */} - } - /> - Not implemented yet} /> - } /> - {/* todo: notfound? */} ); } -}); +); export default App; - -// // Before we continue, let's see if we're supposed to do an SSO redirect -// const [userId] = await Lifecycle.getStoredSessionOwner(); -// const hasPossibleToken = !!userId; -// const isReturningFromSso = !!params.loginToken; -// const autoRedirect = config["sso_immediate_redirect"] === true; -// if (!hasPossibleToken && !isReturningFromSso && autoRedirect) { -// console.log("Bypassing app load to redirect to SSO"); -// const tempCli = createClient({ -// baseUrl: config["validated_server_config"].hsUrl, -// idBaseUrl: config["validated_server_config"].isUrl, -// }); -// PlatformPeg.get().startSingleSignOn( -// tempCli, -// "sso", -// `/${getScreenFromLocation(window.location).screen}` -// ); - -// // We return here because startSingleSignOn() will asynchronously redirect us. We don't -// // care to wait for it, and don't want to show any UI while we wait (not even half a welcome -// // page). As such, just don't even bother loading the MatrixChat component. -// return; -// } diff --git a/packages/editor/src/app/GlobalNavigateRef.ts b/packages/editor/src/app/GlobalNavigateRef.ts new file mode 100644 index 000000000..f96cfb4e3 --- /dev/null +++ b/packages/editor/src/app/GlobalNavigateRef.ts @@ -0,0 +1,9 @@ +import { NavigateFunction } from "react-router-dom"; + +export const navigateRef: { current: NavigateFunction | undefined } = { + current: undefined, +}; + +export function setNavigateRef(navigate: NavigateFunction) { + navigateRef.current = navigate; +} diff --git a/packages/editor/src/app/documentRenderers/DocumentView.tsx b/packages/editor/src/app/documentRenderers/DocumentView.tsx index 858e25c76..3f8fea4ed 100644 --- a/packages/editor/src/app/documentRenderers/DocumentView.tsx +++ b/packages/editor/src/app/documentRenderers/DocumentView.tsx @@ -1,26 +1,31 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { observer } from "mobx-react-lite"; import * as React from "react"; import { useState } from "react"; import { Identifier } from "../../identifiers/Identifier"; import { DocConnection } from "../../store/DocConnection"; -import PluginResource from "../../store/PluginResource"; + import ProjectResource from "../../store/ProjectResource"; -import DocumentMenu from "../main/components/documentMenu"; -import { Breadcrumb } from "../main/components/documentMenu/Breadcrumb"; -import { MenuBar } from "../main/components/menuBar/MenuBar"; + +// import { MenuBar } from "../maidocn/components/menuBar/MenuBar"; // import RichTextRenderer from "./richtext/RichTextRenderer"; import styles from "./DocumentView.module.css"; // import { CustomRenderer } from "./custom/CustomRenderer"; -import NotebookRenderer from "./notebook/NotebookRenderer"; -import PluginRenderer from "./plugin/PluginRenderer"; +import ProfileResource from "../../store/ProfileResource"; +import { SessionStore } from "../../store/local/SessionStore"; +import { DocumentMenu } from "../main/components/documentMenu/DocumentMenu"; + +import ProfileRenderer from "./profile/ProfileRenderer"; import ProjectContainer from "./project/ProjectContainer"; import ProjectRenderer from "./project/ProjectRenderer"; import RichTextRenderer from "./richtext/RichTextRenderer"; type Props = { id: Identifier; + subIdentifiers: Identifier[]; isNested?: boolean; hideDocumentMenu?: boolean; + sessionStore: SessionStore; }; /** @@ -31,7 +36,7 @@ const DocumentView = observer((props: Props) => { const [connection, setConnection] = useState(); React.useEffect(() => { - const newConnection = DocConnection.load(props.id); + const newConnection = DocConnection.load(props.id, props.sessionStore); setConnection(newConnection); // for testing: @@ -43,7 +48,31 @@ const DocumentView = observer((props: Props) => { setConnection(undefined); }; // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.id.toString()]); + }, [props.id.toString(), props.sessionStore]); + + // if we're a fresh sign up, load changes made as guest. Not great to have this logic here + React.useEffect(() => { + const doc = connection?.tryDoc; + if (!doc) { + return; + } + + if ( + props.sessionStore.tryUser?.type === "user" && + props.sessionStore.tryUser.isSignUp && + (doc.type === "!richtext" || doc.type === "!notebook") + ) { + props.sessionStore.documentCoordinator?.loadFromGuest( + doc.identifier.toString(), + doc.ydoc + ); + } + }, [ + connection, + connection?.tryDoc, + props.sessionStore.documentCoordinator, + props.sessionStore.tryUser, + ]); if (!connection) { return null; @@ -58,29 +87,21 @@ const DocumentView = observer((props: Props) => { return
Loading
; } if (connection.doc.type === "!notebook") { - const doc = connection.doc.doc; - - return ( -
- {!props.hideDocumentMenu && ( - - )} - -
- ); + throw new Error("Notebook not implemented"); } else if (connection.doc.type === "!project") { if (props.isNested) { return (
{!props.hideDocumentMenu && ( - - - + )}
); @@ -89,6 +110,8 @@ const DocumentView = observer((props: Props) => { ); } @@ -98,19 +121,25 @@ const DocumentView = observer((props: Props) => { return (
{!props.hideDocumentMenu && ( - + )}
); } else if (connection.doc.type === "!plugin") { + throw new Error("Plugin not implemented"); + } else if (connection.doc.type === "!profile") { return ( - ); } else if (connection.doc.type.startsWith("!")) { diff --git a/packages/editor/src/app/documentRenderers/custom/CustomRenderer.tsx b/packages/editor/src/app/documentRenderers/custom/CustomRenderer.tsx deleted file mode 100644 index b68cab009..000000000 --- a/packages/editor/src/app/documentRenderers/custom/CustomRenderer.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { observer } from "mobx-react-lite"; -import * as React from "react"; -import { useEffect, useState } from "react"; -import { Engine, CodeModel } from "@typecell-org/engine"; -import { getTypeCellCodeModel } from "../../../models/TypeCellCodeModel"; -import { BaseResource } from "../../../store/BaseResource"; -import { DocConnection } from "../../../store/DocConnection"; -import { runtimeStore } from "../../../store/local/runtimeStore"; - -import RetryErrorBoundary from "../../../util/RetryErrorBoundary"; -import { MonacoContext } from "../../../runtime/editor/MonacoContext"; -import { getTypeCellResolver } from "../../../runtime/executor/resolver/resolver"; - -// TODO: should this be a React component or raw JS? - -type Props = { - document: BaseResource; -}; - -/** - * The custom renderer uses the code by a parent document to render a view. - * e.g.: if DocumentA.type === "DocumentB", we use DocumentB as a renderer - */ -export const CustomRenderer = observer((props: Props) => { - if (!props.document.type || props.document.type.startsWith("!")) { - throw new Error("don't expect built-in document as renderer here"); - } - const [rendererDocument, setRendererDocument] = useState(); - const [engine, setEngine] = useState>(); - - const renderer = runtimeStore.customRenderers.get(props.document.type); - const monaco = React.useContext(MonacoContext).monaco; - - useEffect(() => { - if (!renderer) { - return; - } - const loader = DocConnection.load(renderer.rendererId); - setRendererDocument(loader); - return () => { - loader.dispose(); - }; - }, [renderer]); - - // TODO: also useMemo to get engine, instead of useEffect? - useEffect(() => { - if (!rendererDocument?.tryDoc) { - return; - } - - const newEngine = new Engine( - getTypeCellResolver( - rendererDocument.identifier.toString(), - "CR", - monaco as any - ) // TODO - ); - setEngine(newEngine); - - const cells = rendererDocument.tryDoc.doc.cells; - const models = cells.map((c) => getTypeCellCodeModel(c, monaco)); - models.forEach((m) => { - newEngine.registerModel(m.object); - }); - - return () => { - models.forEach((m) => m.dispose()); - newEngine.dispose(); - }; - }, [ - rendererDocument?.identifier, - rendererDocument?.tryDoc, - rendererDocument?.tryDoc?.doc.cells, - monaco, - ]); // TODO: does this create a new engine every time the doc changes? - - if (!renderer) { - return
No renderer for this type found
; - } - if (!rendererDocument || !engine || rendererDocument.doc === "loading") { - return
Loading
; - } - - if (rendererDocument.doc === "not-found") { - return
Not found
; - } - - if (rendererDocument.doc.type !== "!notebook") { - // return
Invalid document type {props.document.type} {rendererDocument.type}
- throw new Error("only notebook documents supported"); - } - - const layoutObject = engine.observableContext.context[renderer.variable]; - - if (!layoutObject) { - return
Invalid renderer for this type
; - } - - return ( - -
{layoutObject}
-
- ); -}); diff --git a/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.module.css b/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.module.css deleted file mode 100644 index 5d0536320..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.module.css +++ /dev/null @@ -1,17 +0,0 @@ -.delete { - position: absolute; - bottom: -2px; - right: 0; - - position: absolute; - margin: 0px; - opacity: 50%; - border: none; - background: none; - cursor: pointer; - color: black; - font-family: "Segoe UI Emoji", "Roboto Mono", monospace; - font-size: 1em; -} - -/* WARNING: A lot of styles are still defined in index.css, mostly related to hovering behavior */ diff --git a/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.tsx b/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.tsx deleted file mode 100644 index fe46d8749..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/CellListDraggableCell.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import { XYCoord } from "dnd-core"; -import { observer } from "mobx-react-lite"; -import React, { useRef, useState } from "react"; -import { DropTargetMonitor, useDrag, useDrop } from "react-dnd"; -import { VscTrash } from "react-icons/vsc"; -import styles from "./CellListDraggableCell.module.css"; -import { HoverTrackerContext } from "./HoverTrackerContext"; - -type Props = { - index: number; - moveCard: (dragIndex: number, hoverIndex: number) => void; - onAddBefore: () => void; - onAddAfter: () => void; - onRemove: () => void; - children: any; -}; - -interface DragItem { - index: number; - // id: string; - type: string; -} - -const CellListDraggableCell: React.FC = observer((props) => { - const [{ isDragging }, drag] = useDrag({ - item: { type: "CELL", index: props.index }, - type: "CELL", - collect: (monitor: any) => ({ - isDragging: monitor.isDragging(), - }), - }); - - const ref = useRef(null); - const dragSourceRef = useRef(null); - const [dndHoverPos, setDndHoverPos] = useState<"top" | "bottom">("top"); - - function calcDrag(item: DragItem, monitor: DropTargetMonitor) { - if (!ref.current) { - return; - } - const dragIndex = item.index; - let hoverIndex = props.index; - - // Don't replace items with themselves - if (dragIndex === hoverIndex) { - return; - } - - // Determine rectangle on screen - const hoverBoundingRect = ref.current?.getBoundingClientRect(); - - // Get vertical middle - const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; - - // Determine mouse position - const clientOffset = monitor.getClientOffset(); - - // Get pixels to the top - const hoverClientY = (clientOffset as XYCoord).y - hoverBoundingRect.top; - - // Only perform the move when the mouse has crossed half of the items height - // When dragging downwards, only move when the cursor is below 50% - // When dragging upwards, only move when the cursor is above 50% - - // Dragging downwards - if (dragIndex < hoverIndex && hoverClientY < hoverMiddleY) { - hoverIndex--; - } - - // Dragging upwards - if (dragIndex > hoverIndex && hoverClientY > hoverMiddleY) { - hoverIndex++; - } - - if (hoverIndex === dragIndex) { - return; - } - - return { - dragIndex, - hoverIndex, - }; - } - - const [{ hovered: dndHovered }, drop] = useDrop({ - accept: "CELL", - - hover(item: DragItem, monitor: DropTargetMonitor) { - if (!ref.current) { - return; - } - // Determine rectangle on screen - const hoverBoundingRect = ref.current.getBoundingClientRect(); - - // Get vertical middle - const hoverMiddleY = - (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2; - - // Determine mouse position - const clientOffset = monitor.getClientOffset(); - - // Get pixels to the top - const hoverClientY = (clientOffset as XYCoord).y - hoverBoundingRect.top; - - setDndHoverPos( - hoverClientY < hoverMiddleY ? ("top" as "top") : ("bottom" as "bottom") - ); - }, - drop: (item, monitor) => { - const calc = calcDrag(item, monitor); - if (!calc) { - return; - } - props.moveCard(calc.dragIndex, calc.hoverIndex); - }, - collect: (monitor) => { - return { - hovered: monitor.isOver(), - }; - }, - }); - // console.log(monitor); - - const opacity = isDragging ? 1 : 1; - drag(dragSourceRef, {}); - drop(ref); - - // When we're hovering over the cell in the parent frame (e.g.: code editor) - const [hovering, setHovering] = useState(false); - - // When we're hovering over the cell output in a sandboxed frame (see SandboxedExecutionHost) - const [childHovering, setChildHovering] = useState(false); - - return ( - { - setChildHovering(hover); - }, - }}> -
{ - setHovering(true); - }} - onMouseLeave={() => { - setHovering(false); - }}> - {dndHovered && dndHoverPos === "top" && ( -
- )} -
- -
- - - {props.children} - - {dndHovered && dndHoverPos === "bottom" && ( -
- )} -
- - ); -}); - -export default CellListDraggableCell; diff --git a/packages/editor/src/app/documentRenderers/notebook/HoverTrackerContext.ts b/packages/editor/src/app/documentRenderers/notebook/HoverTrackerContext.ts deleted file mode 100644 index a90894404..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/HoverTrackerContext.ts +++ /dev/null @@ -1,5 +0,0 @@ -import React from "react"; - -export const HoverTrackerContext = React.createContext({ - setHover: (hover: boolean) => {}, -}); diff --git a/packages/editor/src/app/documentRenderers/notebook/LanguageSelector.tsx b/packages/editor/src/app/documentRenderers/notebook/LanguageSelector.tsx deleted file mode 100644 index bf357b997..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/LanguageSelector.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import Tippy from "@tippyjs/react"; -import { observer } from "mobx-react-lite"; -import React from "react"; -import { SiMarkdown, SiTypescript, SiCss3 } from "react-icons/si"; -import { CellLanguage } from "../../../models/CellModel"; -import styles from "./LanguageSelector.module.css"; - -type Props = { - language: CellLanguage; - onChangeLanguage: (language: CellLanguage) => void; - // onRemove: () => void; -}; - -const NotebookLanguageSelector: React.FC = observer((props) => { - const languageName = (language: CellLanguage) => { - switch (language) { - case "typescript": - return "TypeScript"; - case "markdown": - return "Markdown"; - case "css": - return "CSS"; - } - }; - return ( - <> - - - - -
- } - placement={"bottom-end"} - trigger={"click"} - duration={0} - offset={[0, 3]} - interactive={true}> - - - - ); -}); - -export default NotebookLanguageSelector; diff --git a/packages/editor/src/app/documentRenderers/notebook/NotebookCell.tsx b/packages/editor/src/app/documentRenderers/notebook/NotebookCell.tsx deleted file mode 100644 index 6f2e81384..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/NotebookCell.tsx +++ /dev/null @@ -1,261 +0,0 @@ -import { untracked } from "mobx"; -import { observer } from "mobx-react-lite"; -// import useCellModel from "./useCellModel.ts.bak"; -import type * as monaco from "monaco-editor"; -import React, { - useCallback, - useContext, - useEffect, - useRef, - useState, -} from "react"; -import { VscChevronDown, VscChevronRight } from "react-icons/vsc"; -import { MonacoBinding } from "y-monaco"; -import { Awareness } from "y-protocols/awareness"; -import { - getTypeCellCodeModel, - TypeCellCodeModel, -} from "../../../models/TypeCellCodeModel"; -import SourceModelCompiler from "../../../runtime/compiler/SourceModelCompiler"; -import { MonacoContext } from "../../../runtime/editor/MonacoContext"; -import { ExecutionHost } from "../../../runtime/executor/executionHosts/ExecutionHost"; -import { getStoreService } from "../../../store/local/stores"; -import { HoverTrackerContext } from "./HoverTrackerContext"; -import { NotebookCellModel } from "./NotebookCellModel"; - -type Props = { - cell: NotebookCellModel; - compiler: SourceModelCompiler; - executionHost: ExecutionHost; - onRemove?: () => void; - classList?: string; - defaultCollapsed?: boolean; - initialFocus?: boolean; - awareness: Awareness | undefined; - toolbar?: React.ReactElement; -}; - -const NotebookCell: React.FC = observer((props) => { - const { cell, awareness, compiler, initialFocus } = props; - - const initial = useRef(true); - const [model, setModel] = useState(); - const [monacoModel, setMonacoModel] = useState< - monaco.editor.ITextModel | undefined - >(); - const [editor, setEditor] = useState(); - const disposeHandlers = useRef void>>(); - const monaco = useContext(MonacoContext).monaco; - // const [codeRef, setCodeRef] = useState(); - - const sessionStore = getStoreService().sessionStore; - const user = sessionStore.loggedInUserId; - - const [codeVisible, setCodeVisible] = useState( - untracked( - () => - !( - props.defaultCollapsed === true || - props.cell.language === "markdown" || - props.cell.code.toJSON().startsWith("// @default-collapsed") - ) - ) - ); - - const codeRefCallback = useCallback( - (el: HTMLDivElement) => { - let disposed = false; - if (editor && editor?.getContainerDomNode() !== el) { - disposeHandlers.current?.forEach((dispose) => dispose()); - editor.dispose(); - disposed = true; - setEditor(undefined); - } - - if (el && editor?.getContainerDomNode() !== el) { - if (editor && !disposed) { - throw new Error("not expected"); - } - - const newEditor = monaco.editor.create(el, { - model: null, - scrollBeyondLastLine: false, - minimap: { - enabled: false, - }, - overviewRulerLanes: 0, - lineNumbersMinChars: 1, - lineNumbers: "on", - tabSize: 2, - scrollbar: { - alwaysConsumeMouseWheel: false, - }, - theme: "typecellTheme", - }); - - // disable per-cell find command (https://github.com/microsoft/monaco-editor/issues/102) - (newEditor as any)._standaloneKeybindingService.addDynamicKeybinding( - "-actions.find", - null, // keybinding - () => {} // need to pass an empty handler - ); - - if (initialFocus && initial.current) { - initial.current = false; - // newEditor.focus(); - } - - newEditor.onDidBlurEditorWidget(() => { - newEditor.trigger("blur", "editor.action.formatDocument", {}); - }); - - newEditor.onDidContentSizeChange(() => { - const contentHeight = Math.min(500, newEditor.getContentHeight()); - try { - newEditor.layout({ - height: contentHeight, - width: newEditor.getContainerDomNode()!.offsetWidth, - }); - } finally { - } - }); - - setEditor(newEditor); - } - }, - [editor, initialFocus, monaco.editor] - ); - - useEffect(() => { - const newModel = getTypeCellCodeModel(cell, monaco); - // TODO: do we want to do this here? At least for PluginRenderer, it will register twice - // (currently this is ignored in the engine and only logs a warning) - compiler.registerModel(newModel.object); - const monacoModel = newModel.object.acquireMonacoModel(); - setModel(newModel.object); - setMonacoModel(monacoModel); - return () => { - newModel.object.releaseMonacoModel(); - newModel.dispose(); - setModel(undefined); - setMonacoModel(undefined); - }; - }, [cell, compiler, monaco]); - - useEffect(() => { - if (!editor || !monacoModel) { - return; - } - - editor.setModel(monacoModel); - - const monacoBinding = new MonacoBinding( - cell.code, - monacoModel, - new Set([editor]), - awareness || null // TODO: fix reference to doc - ); - - // This is a bit of a hack. MonacoBinding sets an eventListener to cell.code. - // however, getModel() already has an event listener. - // Make sure that the binding's listener is always raised first, so that: - // - first, the binding applies edits to monaco with applyEdits - // - then, the autorun in observer is called, but we notice the value hasn't changed - // Instead of the other way around: - // - first: the autorun is called, calling monacomodel.setValue() - // - then, the edits are applied - // ---> model value is messed up and we can end up in an infinite loop - const old = cell.code._eH.l.pop()!; - cell.code._eH.l.unshift(old); - - return () => { - monacoBinding.destroy(); - // releaseModel(props.cell); - }; - }, [editor, monacoModel, user, awareness, cell.code]); - - // Disabled, feels weird, work on UX - // editor.current.onKeyUp((e) => { - // // TODO: would be better to trigger this via main.languages.registerOnTypeFormattingEditProvider, but: - // // 1) prettier doesn't have a typeformatting provider (might not be critical as we can use prettier to format complete document) - // // 2) https://github.com/microsoft/monaco-editor/issues/2296 - // if (/*e.code === "Enter" ||*/ e.code === "Semicolon" || e.code === "BracketRight") { - // // TODO performance impact? - // // editor.current!.trigger("enterkey", "editor.action.formatDocument", {}); - // } - // }); - - // var extension = new MonacoMarkdown.MonacoMarkdownExtension(); - // extension.activate(editor.current); - - // disposeHandlers.current = [editor.current.onDidContentSizeChange(() => { - // if (!editor.current) { - // return; - // } - // const contentHeight = Math.min(500, editor.current.getContentHeight()); - // try { - // editor.current.layout({ height: contentHeight, width: element.offsetWidth }); - // } finally { - // } - // }).dispose, () => { - // monacoBinding.destroy(); - // }]; - - // if (props.initialFocus && initial.current) { - // initial.current = false; - // editor.current.focus(); - // } - // } - // }, - // [model, codeRefCallback.current] - // ); - - const hoverTrackerContext = useContext(HoverTrackerContext); - - return ( -
- {codeVisible ? ( - setCodeVisible(false)} - /> - ) : ( - setCodeVisible(true)} - /> - )} - {} -
- {codeVisible && ( -
- {props.toolbar && props.toolbar} -
-
- )} - -
- {model && - props.executionHost.renderOutput( - model, - hoverTrackerContext.setHover - )} -
-
-
- ); -}); - -export default NotebookCell; diff --git a/packages/editor/src/app/documentRenderers/notebook/NotebookCellModel.ts b/packages/editor/src/app/documentRenderers/notebook/NotebookCellModel.ts deleted file mode 100644 index 3d519923f..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/NotebookCellModel.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type * as Y from "yjs"; -export type NotebookCellModel = { - readonly language: string; - /** @internal */ - readonly code: Y.Text; - readonly path: string; - readonly id: string; -}; diff --git a/packages/editor/src/app/documentRenderers/notebook/NotebookRenderer.tsx b/packages/editor/src/app/documentRenderers/notebook/NotebookRenderer.tsx deleted file mode 100644 index c55595915..000000000 --- a/packages/editor/src/app/documentRenderers/notebook/NotebookRenderer.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { observer } from "mobx-react-lite"; -import React, { useContext, useEffect, useMemo, useRef } from "react"; -import { VscDiffAdded } from "react-icons/vsc"; -import SourceModelCompiler from "../../../runtime/compiler/SourceModelCompiler"; -import { MonacoContext } from "../../../runtime/editor/MonacoContext"; -// import LocalExecutionHost from "../../../runtime/executor/executionHosts/local/LocalExecutionHost" -import { ExecutionHost } from "../../../runtime/executor/executionHosts/ExecutionHost"; -import SandboxedExecutionHost from "../../../runtime/executor/executionHosts/sandboxed/SandboxedExecutionHost"; -import { DocumentResource } from "../../../store/DocumentResource"; -import CellListDraggableCell from "./CellListDraggableCell"; -import NotebookLanguageSelector from "./LanguageSelector"; -import NotebookCell from "./NotebookCell"; -import { MonacoColorManager } from "./MonacoColorManager"; -import { getStoreService } from "../../../store/local/stores"; - -type Props = { - document: DocumentResource; -}; - -const USE_SAFE_IFRAME = true; - -const NotebookRenderer: React.FC = observer((props) => { - const sessionStore = getStoreService().sessionStore; - const disposer = useRef<() => void>(); - const monaco = useContext(MonacoContext).monaco; - - useEffect(() => { - // make sure color info is broadcast, and color info from other users are reflected in monaco editor styles - if (props.document.webrtcProvider?.awareness) { - const colorManager = new MonacoColorManager( - props.document.webrtcProvider.awareness, - sessionStore.loggedInUserId || "Anonymous", - sessionStore.userColor - ); - return () => { - colorManager.dispose(); - }; - } - }, [ - props.document.webrtcProvider?.awareness, - sessionStore.loggedInUserId, - sessionStore.userColor, - ]); - - const [compiler, executionHost] = useMemo(() => { - if (disposer.current) { - disposer.current(); - disposer.current = undefined; - } - const newCompiler = new SourceModelCompiler(monaco); - if (!USE_SAFE_IFRAME) { - throw new Error( - "LocalExecutionHost disabled to prevent large bundle size" - ); - // newExecutionHost = new LocalExecutionHost(props.document.id, newCompiler, monaco); - } - const newExecutionHost: ExecutionHost = new SandboxedExecutionHost( - props.document.id, - newCompiler, - monaco - ); - - disposer.current = () => { - newCompiler.dispose(); - newExecutionHost.dispose(); - }; - - return [newCompiler, newExecutionHost]; - }, [props.document.id, monaco]); - - useEffect(() => { - return () => { - if (disposer.current) { - disposer.current(); - disposer.current = undefined; - } - }; - }, []); - - const onAdd = (i: number) => { - props.document.cellList.addCell(i, "typescript", "// Enter code here"); - }; - - const remove = (i: number) => { - props.document.cellList.removeCell(i); - }; - - const cells = props.document.cells; - // renderLogger.log("cellList"); - return ( -
-
- {executionHost.renderContainer()} - {/*

{engine && engine.id} {Math.random()}

*/} - {cells.length === 0 && ( - onAdd(0)} - className="cellList-add-single" - /> - )} - {cells.map((cell, i: number) => ( - onAdd(i)} - onAddAfter={() => onAdd(i + 1)} - onRemove={() => remove(i)} - index={i} - moveCard={props.document.cellList.moveCell}> - cell.setLanguage(language)} - // onRemove={() => remove(i)} - /> - } - /> - - ))} -
-
- ); -}); - -export default NotebookRenderer; \ No newline at end of file diff --git a/packages/editor/src/app/documentRenderers/plugin/PluginRenderer.tsx b/packages/editor/src/app/documentRenderers/plugin/PluginRenderer.tsx deleted file mode 100644 index ec0156723..000000000 --- a/packages/editor/src/app/documentRenderers/plugin/PluginRenderer.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { observer } from "mobx-react-lite"; -import React from "react"; -// import { getEngineForPlugin } from "../../../pluginEngine/pluginSystem.ts.bak"; -import PluginResource from "../../../store/PluginResource"; - -type Props = { - plugin: PluginResource; -}; - -const PluginRenderer: React.FC = observer((props) => { - // const engine = getEngineForPlugin(props.plugin); - - // renderLogger.log("cellList"); - return ( -
- {/* TODO: should execute in a separate sandbox? */} - {/* */} - Not implemented -
- ); -}); - -export default PluginRenderer; diff --git a/packages/editor/src/app/documentRenderers/profile/ProfileRenderer.tsx b/packages/editor/src/app/documentRenderers/profile/ProfileRenderer.tsx new file mode 100644 index 000000000..ef8bfc1c1 --- /dev/null +++ b/packages/editor/src/app/documentRenderers/profile/ProfileRenderer.tsx @@ -0,0 +1,20 @@ +import { observer } from "mobx-react-lite"; +import React from "react"; +import { Identifier } from "../../../identifiers/Identifier"; +import ProfileResource from "../../../store/ProfileResource"; + +type Props = { + profile: ProfileResource; + subIdentifiers: Identifier[]; +}; + +const ProfileRenderer: React.FC = observer((props) => { + return ( +
+

Hello {props.profile.title}

+

Workspaces

+
+ ); +}); + +export default ProfileRenderer; diff --git a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.module.css b/packages/editor/src/app/documentRenderers/project/ProjectContainer.module.css similarity index 77% rename from packages/editor/src/app/documentRenderers/project/ProjectRenderer.module.css rename to packages/editor/src/app/documentRenderers/project/ProjectContainer.module.css index 7b3067da3..36badfc5e 100644 --- a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.module.css +++ b/packages/editor/src/app/documentRenderers/project/ProjectContainer.module.css @@ -8,13 +8,21 @@ } .projectContainer { + --ds-border-selected: transparent; height: 100%; display: flex; - flex-direction: row; + flex-direction: column; align-items: stretch; overflow: hidden; + flex: 1 1; } +#leftSidebar > div > div:first-child > div:first-child { + min-width: 100px !important; +} +.projectContainer > div { + flex: 1 1; +} .sidebarContainer { max-width: 400px; min-width: 250px; diff --git a/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx b/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx index d2b13755a..cb7170532 100644 --- a/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx +++ b/packages/editor/src/app/documentRenderers/project/ProjectContainer.tsx @@ -1,86 +1,328 @@ +import { + Content, + LeftSidebar, + LeftSidebarState, + PageLayout, +} from "@atlaskit/page-layout"; +import { TreeData, TreeItem } from "@atlaskit/tree"; import { observer } from "mobx-react-lite"; -import React from "react"; -import { Outlet, useLocation, useNavigate } from "react-router-dom"; -import { path } from "vscode-lib"; -import { parseIdentifier } from "../../../identifiers"; +import { useNavigate } from "react-router-dom"; +import { Identifier } from "../../../identifiers/Identifier"; +import { identifiersToPath } from "../../../identifiers/paths/identifierPathHelpers"; +import { BaseResource } from "../../../store/BaseResource"; +import { DocConnection } from "../../../store/DocConnection"; import ProjectResource from "../../../store/ProjectResource"; -import DocumentView from "../DocumentView"; +import { SessionStore } from "../../../store/local/SessionStore"; + +import { ChildReference } from "@typecell-org/shared"; +import { uri } from "vscode-lib"; +import { HttpsIdentifier } from "../../../identifiers/HttpsIdentifier"; +import { TypeCellIdentifier } from "../../../identifiers/TypeCellIdentifier"; +import styles from "./ProjectContainer.module.css"; import FolderView from "./directoryNavigation/FolderView"; import SidebarTree from "./directoryNavigation/SidebarTree"; -import { filesToTreeNodes } from "./directoryNavigation/treeNodeUtil"; -import styles from "./ProjectRenderer.module.css"; type Props = { project: ProjectResource; + activeChild?: Identifier; isNested?: boolean; + children?: React.ReactNode; + sessionStore: SessionStore; }; +function docToTreeItem( + doc: BaseResource, + items: Record, + sessionStore: SessionStore, + root = false +) { + const children = doc.getRefs(ChildReference); + const childrenWithDocs = children.map((c) => { + const doc = DocConnection.get(c.target, sessionStore); + const resource = doc?.tryDoc; + return { + doc: resource, + id: c.target, + }; + }); + + const childrenWithLoadedDocs = childrenWithDocs.filter( + (c) => c.doc !== undefined + ); + const isChildrenLoading = childrenWithLoadedDocs.length !== children.length; + + const childrenIds: string[] = []; + + childrenWithLoadedDocs.forEach((c) => { + if (c.doc) { + childrenIds.push(docToTreeItem(c.doc, items, sessionStore).id as string); + } + }); + + let i = 0; + let id = doc.id + "-" + i; + + while (items[id]) { + id = doc.id + "-" + ++i; + } + const ret: TreeItem = { + id, + isChildrenLoading, + children: childrenIds, + hasChildren: children.length > 0, + isExpanded: root, + data: { + id: doc.id, + identifier: doc.identifier, + allChildren: children.map((c) => c.target), + title: doc.type === "!richtext" ? doc.doc.title : doc.title, + }, + }; + + items[id] = ret; + return ret; +} + +function docToAkTree( + doc: BaseResource, + sessionStore: SessionStore, + activeId?: Identifier +) { + const items: Record = {}; + const rootItem = docToTreeItem(doc, items, sessionStore, true); + const root: TreeData = { + rootId: rootItem.id, + items, + // id: doc.id, + // children: [], + // hasChildren: false, + // isExpanded: false, + // isChildrenLoading: false, + // data: { + }; + + if (activeId) { + for (const item of Object.values(items)) { + if (item.data.id === activeId.toString()) { + item.data.isActive = true; + } else { + item.data.isActive = false; + } + } + } + return root; +} + const ProjectContainer = observer((props: Props) => { - const location = useLocation(); const navigate = useNavigate(); - const files = Array.from(props.project.files.keys()).sort(); - const tree = filesToTreeNodes( - files.map((f) => ({ - fileName: f, - })) + const tree = docToAkTree( + props.project, + props.sessionStore, + props.activeChild ); - const onClick = (item: string) => { - const isDocs = location.pathname.startsWith("/docs"); + const onAddPageHandler = async (parentId?: string) => { + const ret = await DocConnection.create(props.sessionStore); + if (typeof ret === "string") { + throw new Error("Error creating doc: " + ret); + } + ret.create("!richtext"); + + if (parentId) { + // add to parent + const parentDoc = DocConnection.get(parentId, props.sessionStore)?.tryDoc; + if (!parentDoc) { + throw new Error("Parent not found: " + parentId); + } + parentDoc.addRef(ChildReference, ret.identifier, undefined, false); // TODO: true + } else { + // add to root (project) + props.project.addRef(ChildReference, ret.identifier, undefined, false); // TODO: true + } + const path = identifiersToPath([props.project.identifier, ret.identifier]); navigate({ - pathname: props.isNested - ? path.join(location.pathname, "/", item) - : isDocs - ? item - : ":/" + item, + pathname: "/" + path, + }); + }; + + const onClick = (identifier: Identifier) => { + const path = identifiersToPath([props.project.identifier, identifier]); + + navigate({ + pathname: "/" + path, }); }; - let defaultFile = files.find((f) => f === "README.md"); - let defaultFileContent = <>; - if (defaultFile) { - // TODO: cleanup? - // Directory listing with a default file - let idTemp = parseIdentifier(props.project.identifier.uri.toString()); - idTemp.subPath = defaultFile; - let documentIdentifier = parseIdentifier( - idTemp.fullUriOfSubPath()!.toString() - ); - defaultFileContent = ( - - ); - } if (props.isNested) { + // nested, no sidebar return (
- -
- {defaultFileContent} -
- ); - } else { - return ( -
-
- + { + let path = identifiersToPath([ + props.project.identifier, + item.data.identifier, + ]); + + if (item.data.identifier instanceof HttpsIdentifier) { + // TODO: hardcoded fix for docs + path = identifiersToPath([ + new HttpsIdentifier( + uri.URI.parse(window.location.protocol + "//" + window.location.host + "/_docs/") + ), + // props.project.identifier, + item.data.identifier, + ]); + } + navigate({ + pathname: "/" + path, + }); + }} + tree={tree} + />
{/* {defaultFileContent} */} -
); } + const userIsOwner = [ + ...(props.sessionStore.profile?.workspaces.values() || []), + ].includes(props.project.identifier.toString()); + + const enableAddPages = props.project.identifier instanceof TypeCellIdentifier; + + return ( +
+ + console.log("onExpand", state) + } + onLeftSidebarCollapse={(state: LeftSidebarState) => + console.log("onCollapse", state) + }> + + + console.log("onResizeStart", state) + } + onResizeEnd={(state: LeftSidebarState) => + console.log("onResizeEnd", state) + } + onFlyoutExpand={() => console.log("onFlyoutExpand")} + onFlyoutCollapse={() => console.log("onFlyoutCollapse")} + // overrides={{ + // ResizeButton: { + // render: (Component, props) => ( + + // // + // + // // + // ), + // }, + // }} + > +
+ +
+
+ {/*
+ +
*/} + {/* {defaultFileContent} */} +
+ {props.children} + + {/* */} +
+
+
+
+ ); }); export default ProjectContainer; + +/** + +DocA + - DocB + - DocD + - DocC + + DocB.children = [DocD] + DocD.parent = DocB + + // reparent 1 + DocB.children = [] // what if no access? + DocC.children = [DocD] + DocD.parent = DocC + + // reparent 2 + DocB.children = [] + DocA.children = [DocD] + DocD.parent = DocA + + // conflict + - DocA + - DocB + - DocC + - DocD + - DocD + + */ + +// Doc A: +// + +// Doc B has an inbox with the following messages: +// +// +// +// + +// I get Doc A, it refers to a child. Is this ok? +// Get Doc B. +// - It's not at clock. We can't validate the child / parent rel because we're not synced yet +// - it is at clock. Check if update has been subsumed +// - check c. +// - it's not at clock. + +// BackRef validation algorithm: +// - keep an inbox of validated messages +// - load next message that should be validated +// - if other document is not at clock, keep in queue because we're not synced yet, continue next +// - if document is at clock, validate +// - if document contains message, accept message as truth. mark validated and wait until it becomes invalid before checking the next message +// - if document does not contain message, ignore message. mark validated and continue next + +// Issue: +// - User Alice doesn't have access to B, but moves it's child c1 from B to C +// - this is fine, other clients won't validate her message because B still contains c1 +// - Bob then moves child c1 from B to D +// - Alice's message is now valid, because B no longer contains c1. Bob's message won't be processed + +// too complicated. use a different approach where children can have multiple parents and they'll be shown as "copy" if so. oldest = original diff --git a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx b/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx index 833aa1f6a..d25de2001 100644 --- a/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx +++ b/packages/editor/src/app/documentRenderers/project/ProjectRenderer.tsx @@ -1,83 +1,71 @@ +import { ChildReference, IndexFileReference } from "@typecell-org/shared"; import { observer } from "mobx-react-lite"; import React from "react"; -import { - Route, - Routes, - useLocation, - useOutletContext, - useParams, -} from "react-router-dom"; -import { path } from "vscode-lib"; import { parseIdentifier } from "../../../identifiers"; import { Identifier } from "../../../identifiers/Identifier"; import ProjectResource from "../../../store/ProjectResource"; +import { SessionStore } from "../../../store/local/SessionStore"; import DocumentView from "../DocumentView"; import ProjectContainer from "./ProjectContainer"; +import EmptyState from "@atlaskit/empty-state"; + type Props = { project: ProjectResource; isNested?: boolean; + subIdentifiers: Identifier[]; + sessionStore: SessionStore; }; -const NestedDocument = (props: { parent: Identifier }) => { - const params = useParams(); - const sub = params["*"] as string; - - const newIdStr = path.join(props.parent.toString(), "/:/", sub); - const documentIdentifier = parseIdentifier( - parseIdentifier(newIdStr).fullUriOfSubPath()!.toString() - ); - return ; -}; - -const RootDirectory = (props: {}) => { - const defaultDoc = (useOutletContext() as any)?.defaultFileContent as any; - return defaultDoc || <>; -}; - -// const Debug = (props: { children: any }) => { -// const params = useParams(); -// return ( -//
-//
params: {JSON.stringify(params)}
-// {props.children} -//
-// ); +// const RootDirectory = () => { +// return
hello
; +// // const defaultDoc = (useOutletContext() as any)?.defaultFileContent as any; +// // return defaultDoc || <>; // }; + const ProjectRenderer: React.FC = observer((props) => { - // const fileSet = useRef(new ObservableSet()); - const identifier = props.project.identifier; - const path = useLocation(); + let [childId, ...remainingIds] = props.subIdentifiers; - const subPath = (useParams() as any).subPath; - if (subPath) { - throw new Error("unexpected"); + if (!childId) { + const indexFile = props.project.getRefs(IndexFileReference); + if (indexFile.length) { + childId = parseIdentifier(indexFile[0].target); + remainingIds = []; + } } - const isDocs = path.pathname.startsWith("/docs"); - const rootPath = isDocs ? "docs" : identifier.toString(); + if (!childId) { + const children = props.project.getRefs(ChildReference); + if (children.length) { + childId = parseIdentifier(children[0].target); + remainingIds = []; + } + } return ( - - }> - } /> - {isDocs ? ( - } /> - ) : ( - } /> - )} - - {/* - errorsdf {rootPath} {path.pathname} {identifier.toRouteString()} - - } - /> */} - + + {childId ? ( + + ) : ( +
+ Request access} + // secondaryAction={} + // tertiaryAction={} + /> +
+ )} +
); }); diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx b/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx index 5b2778952..9ed4c49cf 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/FolderView.tsx @@ -1,42 +1,80 @@ import Button from "@atlaskit/button"; +import { TreeData, TreeItem } from "@atlaskit/tree"; import { observer } from "mobx-react-lite"; -import React from "react"; +import { useEffect, useRef } from "react"; import { AiFillFolder } from "react-icons/ai"; import { VscFile } from "react-icons/vsc"; +import { DocConnection } from "../../../../store/DocConnection"; +import { SessionStore } from "../../../../store/local/SessionStore"; import styles from "./FolderView.module.css"; -import { TreeNode } from "./treeNodeUtil"; +// import { TreeNode } from "./treeNodeUtil"; export const ItemView = (props: { - file: TreeNode; - onClick: (item: string) => void; + file: TreeItem; + onClick: (item: TreeItem) => void; }) => { const onClick = () => { - props.onClick(props.file.fileName); + props.onClick(props.file); }; return ( ); }; export const FolderView = observer( - (props: { tree: TreeNode[]; onClick: (item: string) => void }) => { + (props: { + tree: TreeData; + sessionStore: SessionStore; + onClick: (item: TreeItem) => void; + }) => { + const { sessionStore, tree } = props; + const cache = useRef(new Map()); + + useEffect(() => { + const itemsToLoad = new Set(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tree.items[tree.rootId].data.allChildren.forEach((child: any) => { + itemsToLoad.add(child as string); + }); + + // clear items from cache if not in itemsToLoad + for (const [key, item] of cache.current.entries()) { + if (!itemsToLoad.has(key)) { + item.dispose(); + cache.current.delete(key); + } + } + + // load items + for (const key of itemsToLoad) { + if (!cache.current.has(key)) { + const item = DocConnection.load(key, sessionStore); + cache.current.set(key, item); + } + } + }, [tree, sessionStore]); + return (
- {props.tree.map((file) => ( - + {props.tree.items[props.tree.rootId].children.map((file) => ( + ))}
); diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.module.css b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.module.css index 2b1892ed3..b2217c650 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.module.css +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.module.css @@ -4,15 +4,62 @@ font-weight: normal !important; font-size: 13px !important; height: 2.1em !important; + padding-right: 2px !important; } -.chevron { +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.kebab, +.addChild { + /* visibility: hidden; */ + display: none; + opacity: 0; + /* transition: opacity 0.2s ease-in 0.1s; */ +} + +.sidebarButton.active { + background-color: var( + --ds-background-neutral-subtle-hovered, + rgba(9, 30, 66, 0.08) + ); + font-weight: bolder !important; +} + +.sidebarButton:hover .kebab, +.sidebarButton:hover .addChild { + display: inline-block; + animation: fade-in 0.3s ease-in 0.1s; + animation-fill-mode: forwards; + /* visibility: visible; */ + opacity: 0; +} + +.chevron, +.kebab, +.addChild, +.add { width: 20px; height: 20px; padding: 5px; border-radius: 3px; } -.chevron:hover { +.kebab { + width: 16px; + padding: 0; + height: 20px; + padding-top: 2px; +} +.chevron:hover, +.kebab:hover, +.addChild:hover, +.add:hover { background-color: #d8dadf; } diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx index c9036e6cd..1c0444f87 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/SidebarTree.tsx @@ -1,126 +1,294 @@ import Button from "@atlaskit/button"; -import Tree, { ItemId, mutateTree, RenderItemParams } from "@atlaskit/tree"; -import _ from "lodash"; +import Tree, { + ItemId, + mutateTree, + RenderItemParams, + TreeData, + TreeDestinationPosition, + TreeSourcePosition, +} from "@atlaskit/tree"; import { observer } from "mobx-react-lite"; -import React, { useCallback, useEffect, useState } from "react"; -import { VscChevronDown, VscChevronRight } from "react-icons/vsc"; +import React, { useEffect, useMemo, useRef } from "react"; +import { + VscAdd, + VscChevronDown, + VscChevronRight, + VscKebabVertical, +} from "react-icons/vsc"; +import { Identifier } from "../../../../identifiers/Identifier"; +import { DocConnection } from "../../../../store/DocConnection"; +import { SessionStore } from "../../../../store/local/SessionStore"; + +import { ChildReference } from "@typecell-org/shared"; import styles from "./SidebarTree.module.css"; -import { treeToTreeData } from "./treeDataUtil"; -import { TreeNode } from "./treeNodeUtil"; - -const RenderItem = ({ - item, - onExpand, - onCollapse, - provided, - depth, -}: RenderItemParams) => { - const onClick = () => { - // main item has clicked (not chevron, always call onExpand) - (onExpand as any)({ id: item.id, isChevron: false }); - }; - const onChevronClick = (e: React.MouseEvent) => { - e.stopPropagation(); - if (item.isExpanded) { - (onCollapse as any)({ id: item.id, isChevron: true }); - } else { - (onExpand as any)({ id: item.id, isChevron: true }); - } - }; +const RenderItem = + ( + onClick: (item: Identifier) => void, + onAddChild: ((parentId: string) => void) | false + ) => + ({ item, onExpand, onCollapse, provided, depth }: RenderItemParams) => { + // const doc = DocConnection.get(item.data.identifier)?.tryDoc; + // if (!doc) { + // console.warn("Doc not found but should be loaded", item.data.identifier); + // return null; + // } - return ( -
- -
- ); -}; + }> + {item.data.title || "Untitled"} + +
+ ); + }; + +function updateAkTree(oldTree: TreeData, newTree: TreeData) { + for (const [key, item] of Object.entries(newTree.items)) { + if (oldTree.items[key]) { + item.isExpanded = oldTree.items[key].isExpanded; + } + } +} export const SidebarTree = observer( - (props: { tree: TreeNode[]; onClick: (item: string) => void }) => { - const [akTree, setAktree] = useState(() => treeToTreeData(props.tree)); - - // eslint-disable-next-line react-hooks/exhaustive-deps - const update = useCallback( - _.debounce( - (tree: TreeNode[]) => { - const newTree = treeToTreeData(tree); - for (let item of Object.keys(newTree.items)) { - if (akTree.items[item]) { - newTree.items[item].isExpanded = akTree.items[item].isExpanded; - } - } - setAktree(newTree); - }, - 100, - { trailing: true } - ), - [akTree] - ); + (props: { + tree: TreeData; + onClick: (item: Identifier) => void; + onAddNewPage: ((parent?: string) => Promise) | false; + enableAddRootPage: boolean; + enableDrag: boolean; + sessionStore: SessionStore; + }) => { + const { sessionStore, tree } = props; + // A little cumbersome logic because we want to update the currentTree + // both from outside this component and inside + const currentTree = useRef(tree); + const prevTreeFromProps = useRef(tree); + const cache = useRef(new Map()); + const [forceUpdate, setForceUpdate] = React.useState(0); + + // detect change in props + if (prevTreeFromProps.current !== tree) { + updateAkTree(currentTree.current, tree); + currentTree.current = tree; + prevTreeFromProps.current = tree; + } + const akTree = currentTree.current; useEffect(() => { - update(props.tree); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [props.tree]); + const itemsToLoad = new Set(); + for (const item of Object.values(akTree.items)) { + if (item.isExpanded) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + item.data.allChildren.forEach((child: any) => { + itemsToLoad.add(child as string); + }); + } + } - const onExpand = (info: { id: ItemId; isChevron: boolean }) => { - setAktree(mutateTree(akTree, info.id, { isExpanded: true })); - const item = akTree.items[info.id]; + // clear items from cache if not in itemsToLoad + for (const [key, item] of cache.current.entries()) { + if (!itemsToLoad.has(key)) { + item.dispose(); + cache.current.delete(key); + } + } - if (!info.isChevron) { - props.onClick(item.data!.path); + // load items + for (const key of itemsToLoad) { + if (!cache.current.has(key)) { + const item = DocConnection.load(key, sessionStore); + cache.current.set(key, item); + } } + }, [akTree, sessionStore]); + + const onExpand = (id: ItemId) => { + const mutated = mutateTree(akTree, id, { + isExpanded: true, + }); + currentTree.current = mutated; + setForceUpdate(forceUpdate + 1); }; - const onCollapse = (info: { id: ItemId; isChevron: boolean }) => { - setAktree(mutateTree(akTree, info.id, { isExpanded: false })); - const item = akTree.items[info.id]; + const onCollapse = (id: ItemId) => { + const mutated = mutateTree(akTree, id, { isExpanded: false }); + currentTree.current = mutated; + setForceUpdate(forceUpdate + 1); + }; + + const renderItem = useMemo( + () => RenderItem(props.onClick, props.onAddNewPage), + [props.onAddNewPage, props.onClick] + ); - if (!info.isChevron) { - props.onClick(item.data!.path); + const onDragEnd = ( + source: TreeSourcePosition, + destination?: TreeDestinationPosition + ) => { + if (!destination) { + return; } + const sourceDoc = DocConnection.get( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + akTree.items[source.parentId].data!.id + "", + sessionStore + )?.tryDoc; + const destDoc = DocConnection.get( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + akTree.items[destination.parentId].data!.id + "", + sessionStore + )?.tryDoc; + if (!sourceDoc || !destDoc) { + throw new Error("Doc not found but should be loaded"); + } + + const itemIdentifier: Identifier = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + akTree.items[akTree.items[source.parentId].children[source.index]].data! + .identifier; + + if (destDoc === sourceDoc) { + if (destination.index === undefined) { + throw new Error("no destination index"); + } + sourceDoc.moveRef(ChildReference, itemIdentifier, destination.index); + } else { + destDoc.addRef( + ChildReference, + itemIdentifier, + destination.index || 0, + false + ); // TODO (must be true) + sourceDoc.removeRef(ChildReference, itemIdentifier); + } + // const { tree } = this.state; + // if (!destination) { + // return; + // } + // const newTree = moveItemOnTree(tree, source, destination); + // this.setState({ + // tree: newTree, + // }); }; + const onAddNewPage = props.onAddNewPage; + return ( - + <> + {}} + onDragEnd={onDragEnd} + offsetPerLevel={17} + isDragEnabled={props.enableDrag} + isNestingEnabled + /> + {props.enableAddRootPage && onAddNewPage && ( + + )} + ); } ); diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts b/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts deleted file mode 100644 index ca678e09e..000000000 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeDataUtil.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { TreeData } from "@atlaskit/tree"; -import { TreeNode } from "./treeNodeUtil"; - -/** - * Convert a TreeNode[] tree to Atlaskit TreeData format - */ -export function treeToTreeData(tree: TreeNode[]) { - // tree.sort(sortTreeItems); - const ret: TreeData = { - rootId: "root", - items: { - root: { - id: "root", - children: tree.map((t) => t.fileName), - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "root", - }, - }, - }, - }; - - function processTree(parent: string, tree: TreeNode[]) { - for (let child of tree) { - // child.children.sort(sortTreeItems); - const fullName = parent + child.fileName; - ret.items[fullName] = { - id: fullName, - children: child.children.map((t) => fullName + "/" + t.fileName), - hasChildren: child.children.length ? true : false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: child.fileName, - path: fullName, - }, - }; - processTree(fullName + "/", child.children); - } - } - processTree("", tree); - // console.log(ret); - return ret; -} - -/* -Example atlaskit treedata: - -export const tree: TreeData = { - rootId: "1", - items: { - "1": { - id: "1", - children: ["1-1", "1-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "root", - }, - }, - "1-1": { - id: "1-1", - children: ["1-1-1", "1-1-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "First parent", - }, - }, - "1-2": { - id: "1-2", - children: ["1-2-1", "1-2-2"], - hasChildren: true, - isExpanded: true, - isChildrenLoading: false, - data: { - title: "Second parent", - }, - }, - "1-1-1": { - id: "1-1-1", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child one", - }, - }, - "1-1-2": { - id: "1-1-2", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child two", - }, - }, - "1-2-1": { - id: "1-2-1", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child three", - }, - }, - "1-2-2": { - id: "1-2-2", - children: [], - hasChildren: false, - isExpanded: false, - isChildrenLoading: false, - data: { - title: "Child four", - }, - }, - }, -};*/ diff --git a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeNodeUtil.ts b/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeNodeUtil.ts index e815bb86d..25ee6f253 100644 --- a/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeNodeUtil.ts +++ b/packages/editor/src/app/documentRenderers/project/directoryNavigation/treeNodeUtil.ts @@ -18,12 +18,13 @@ export function sortTreeItems(a: TreeNode, b: TreeNode) { // https://stackoverflow.com/a/51012811/194651 export function filesToTreeNodes(arr: File[]): TreeNode[] { - var tree: any = {}; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const tree: any = {}; function addnode(obj: File) { - var splitpath = obj.fileName.replace(/^\/|\/$/g, "").split("/"); - var ptr = tree; + const splitpath = obj.fileName.replace(/^\/|\/$/g, "").split("/"); + let ptr = tree; for (let i = 0; i < splitpath.length; i++) { - let node: any = { + const node = { fileName: splitpath[i], isDirectory: true, }; @@ -35,6 +36,7 @@ export function filesToTreeNodes(arr: File[]): TreeNode[] { ptr = ptr[splitpath[i]].children; } } + // eslint-disable-next-line @typescript-eslint/no-explicit-any function objectToArr(node: any) { Object.keys(node || {}).forEach((k) => { if (node[k].children) { diff --git a/packages/editor/src/app/documentRenderers/richtext/FrameHost.tsx b/packages/editor/src/app/documentRenderers/richtext/FrameHost.tsx new file mode 100644 index 000000000..77ddef3d9 --- /dev/null +++ b/packages/editor/src/app/documentRenderers/richtext/FrameHost.tsx @@ -0,0 +1,100 @@ +import { IframeBridgeMethods } from "@typecell-org/shared"; +import { ContainedElement } from "@typecell-org/util"; +import { AsyncMethodReturns, connectToChild } from "penpal"; +import { useMemo } from "react"; +import { parseIdentifier } from "../../../identifiers"; +import { DocumentResourceModelProvider } from "../../../store/DocumentResourceModelProvider"; +import { SessionStore } from "../../../store/local/SessionStore"; +import { ModelForwarder } from "./ModelForwarder"; + +export function FrameHost(props: { url: string; sessionStore: SessionStore }) { + const frame: HTMLIFrameElement = useMemo(() => { + /** + * Penpal postmessage connection methods exposed by the iframe + */ + let connectionMethods: AsyncMethodReturns | undefined; + + const moduleManagers = new Map< + string, + { provider: DocumentResourceModelProvider; forwarder: ModelForwarder } + >(); + + const methods = { + registerTypeCellModuleCompiler: async (moduleName: string) => { + if (moduleManagers.has(moduleName)) { + console.warn("already has moduleManager for", moduleName); + return; + } + if (!moduleName.startsWith("!")) { + throw new Error("invalid module name"); + } + const identifierStr = moduleName.substring(1); + const identifier = parseIdentifier(identifierStr); + const provider = new DocumentResourceModelProvider( + identifier, + props.sessionStore + ); + + const forwarder = new ModelForwarder( + "modules/" + moduleName, + provider, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + connectionMethods! + ); + moduleManagers.set(moduleName, { provider, forwarder }); + await forwarder.initialize(); + return identifier.toString(); + }, + unregisterTypeCellModuleCompiler: async (moduleName: string) => { + const moduleManager = moduleManagers.get(moduleName); + if (!moduleManager) { + console.warn("no moduleManager for", moduleName); + return; + } + moduleManager.provider.dispose(); + moduleManager.forwarder.dispose(); + moduleManagers.delete(moduleName); + }, + }; + + const iframe = document.createElement("iframe"); + // iframe.style.position = "absolute"; + // iframe.style.width = "100%"; + // iframe.style.height = "100%"; + // iframe.style.pointerEvents = "all"; + iframe.style.border = "none"; + iframe.className = "fullSize"; + iframe.sandbox.add( + "allow-same-origin", + "allow-scripts", + "allow-downloads", + "allow-popups", + "allow-modals", + "allow-forms", + "allow-popups-to-escape-sandbox", + "allow-top-navigation-by-user-activation" + ); + iframe.allow = + "geolocation; microphone; camera; midi; encrypted-media; autoplay; accelerometer; magnetometer; gyroscope"; + iframe.allowFullscreen = true; + iframe.src = props.url; + + const connection = connectToChild({ + // The iframe to which a connection should be made + iframe: iframe, + // Methods the parent is exposing to the child + methods: methods, + }); + connection.promise.then((methods) => { + connectionMethods = methods; + }); + return iframe; + }, [props.url, props.sessionStore]); + + return ( + <> + {/* */} + + + ); +} diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/ModelForwarder.ts b/packages/editor/src/app/documentRenderers/richtext/ModelForwarder.ts similarity index 72% rename from packages/editor/src/runtime/executor/executionHosts/sandboxed/ModelForwarder.ts rename to packages/editor/src/app/documentRenderers/richtext/ModelForwarder.ts index aaa674ef5..184cc7010 100644 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/ModelForwarder.ts +++ b/packages/editor/src/app/documentRenderers/richtext/ModelForwarder.ts @@ -1,11 +1,9 @@ -import { CompiledCodeModel } from "../../../../models/CompiledCodeModel"; -import { event, lifecycle } from "vscode-lib"; -import { IframeBridgeMethods } from "./iframesandbox/IframeBridgeMethods"; - -type ModelProvider = { - onDidCreateCompiledModel: event.Event; - compiledModels: CompiledCodeModel[]; -}; +import { + BasicCodeModel, + IframeBridgeMethods, + ModelProvider, +} from "@typecell-org/shared"; +import { lifecycle } from "vscode-lib"; export type MessageBridge = Pick< IframeBridgeMethods, @@ -29,27 +27,27 @@ export class ModelForwarder extends lifecycle.Disposable { super(); this._register( - modelProvider.onDidCreateCompiledModel((m) => { + modelProvider.onDidCreateModel((m) => { this.registerModel(m); }) ); } public async initialize() { - for (let model of this.modelProvider.compiledModels) { + for (const model of this.modelProvider.models) { await this.registerModel(model, false); } // send in bulk await this.messageBridge.updateModels( this.bridgeId, - this.modelProvider.compiledModels.map((m) => ({ + this.modelProvider.models.map((m) => ({ modelId: m.path, - model: { value: m.getValue() }, + model: { value: m.getValue(), language: m.language }, })) ); } - private async registerModel(model: CompiledCodeModel, sendToBridge = true) { + private async registerModel(model: BasicCodeModel, sendToBridge = true) { if (this.disposed) { throw new Error("registering model on disposed engine"); } @@ -64,6 +62,7 @@ export class ModelForwarder extends lifecycle.Disposable { model.onDidChangeContent(() => { this.messageBridge.updateModel(this.bridgeId, model.path, { value: model.getValue(), + language: model.language, }); }) ); @@ -71,6 +70,7 @@ export class ModelForwarder extends lifecycle.Disposable { if (sendToBridge) { await this.messageBridge.updateModel(this.bridgeId, model.path, { value: model.getValue(), + language: model.language, }); } } diff --git a/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.module.css b/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.module.css deleted file mode 100644 index fa3b3dc34..000000000 --- a/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.editor { - padding: 0 calc((100% - 731px) / 2); - height: 100%; -} diff --git a/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.tsx b/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.tsx index 7deb38a9f..db860e900 100644 --- a/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.tsx +++ b/packages/editor/src/app/documentRenderers/richtext/RichTextRenderer.tsx @@ -1,49 +1,67 @@ import { observer } from "mobx-react-lite"; -import React from "react"; +import React, { useEffect, useMemo } from "react"; // import LocalExecutionHost from "../../../runtime/executor/executionHosts/local/LocalExecutionHost" -import { EditorContent, useEditor } from "@blocknote/core"; import "@blocknote/core/style.css"; -import Collaboration from "@tiptap/extension-collaboration"; -import CollaborationCursor from "@tiptap/extension-collaboration-cursor"; -import ReactDOM from "react-dom"; -import { DocumentResource } from "../../../store/DocumentResource"; -import { getStoreService } from "../../../store/local/stores"; -import styles from "./RichTextRenderer.module.css"; +import { uniqueId } from "@typecell-org/util"; +import { WebsocketProvider } from "y-websocket"; +import { getFrameDomain } from "../../../config/security"; +import { DocumentResource } from "../../../store/DocumentResource"; +import { SessionStore } from "../../../store/local/SessionStore"; +import { FrameHost } from "./FrameHost"; type Props = { document: DocumentResource; + sessionStore: SessionStore; }; -window.React = React; -window.ReactDOM = ReactDOM; + +class FakeProvider { + constructor(public readonly awareness: any) {} +} const RichTextRenderer: React.FC = observer((props) => { - const sessionStore = getStoreService().sessionStore; - - const editor = useEditor({ - onUpdate: ({ editor }) => { - console.log(editor.getJSON()); - }, - editorProps: { - attributes: { - class: styles.editor, - "data-test": "editor", - }, - }, - disableHistoryExtension: true, - extensions: [ - CollaborationCursor.configure({ - provider: props.document.webrtcProvider, - user: { - name: sessionStore.loggedInUserId || "Anonymous", - color: sessionStore.userColor, - }, - }), - Collaboration.configure({ - fragment: props.document.data, - }), - ], - }); - return ; + const roomName = useMemo(() => { + return "room-" + uniqueId.generateUuid(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [props.document.id]); + + useEffect(() => { + const provider = new WebsocketProvider("", roomName, props.document.ydoc, { + connect: false, + awareness: props.document.awareness, + }); + // console.log("setup", props.document.ydoc.getXmlFragment("doc").toJSON()); + // props.document.ydoc.on("update", () => { + // console.log("host ydoc", props.document.ydoc.toJSON()); + // }); + // provider.awareness.on("update", () => { + // console.log("update2"); + // }); + provider.connectBc(); + return () => { + provider.disconnectBc(); + provider.destroy(); + }; + }, [props.document, roomName]); + + const params = new URLSearchParams(); + params.append("documentId", props.document.id); + params.append("roomName", roomName); + params.append("userColor", props.sessionStore.userColor); + params.append("userName", props.sessionStore.loggedInUserId || "anonymous"); + + if (window.location.search.includes("noRun")) { + params.append("noRun", "true"); + } + + const src = + window.location.protocol + + "//" + + getFrameDomain() + + "/?frame" + + "#" + + params.toString(); + + return ; }); export default RichTextRenderer; diff --git a/packages/editor/src/app/main/Main.module.css b/packages/editor/src/app/main/Main.module.css index 31401a83e..52d5daeab 100644 --- a/packages/editor/src/app/main/Main.module.css +++ b/packages/editor/src/app/main/Main.module.css @@ -22,26 +22,38 @@ rgba(0, 255, 255, 0) 400px, rgba(255, 255, 255, 1) 700px ), - radial-gradient(circle at 15% 35%, #dbe4ff, rgba(255, 255, 255, 0) 25%), + radial-gradient(circle at 15% 35%, #4caf7e33, rgba(255, 255, 255, 0) 25%), radial-gradient(circle at 85% 20%, #e3fafc, rgba(255, 255, 255, 0) 25%), white; background-repeat: no-repeat; } -.main.homepage > header { +.main.homepage > header[role="banner"] { + /* background: white !important; */ + transition: 0.2s ease !important; + transition-property: background-color, backdrop-filter !important; + backdrop-filter: blur(6px) !important; + background-color: #fffc !important; + + position: fixed; + width: 100%; + z-index: 100000; +} + +.main.homepage.top > header[role="banner"] { background: none !important; } .main.ai header div { - display:none; + display: none; } .main.ai nav div { - display:none; + display: none; } .main.ai nav span { - display:none; + display: none; } .main { @@ -51,7 +63,7 @@ align-items: stretch; } .main > header { - z-index: 10000000; + /* z-index: 10000000; */ /* border-bottom: 1px solid rgb(239, 241, 244); */ /* border-bottom: linear-gradient( 90deg, @@ -59,6 +71,7 @@ rgba(255, 255, 255, 0.7) 50%, rgba(255, 255, 255, 1) 100% ); */ + z-index: 10000; } /* Page wrapper styles */ diff --git a/packages/editor/src/app/main/Main.tsx b/packages/editor/src/app/main/Main.tsx index 25dae062a..24a7629d8 100644 --- a/packages/editor/src/app/main/Main.tsx +++ b/packages/editor/src/app/main/Main.tsx @@ -1,41 +1,53 @@ +import classNames from "classnames"; import { observer } from "mobx-react-lite"; +import { useCallback, useEffect, useState } from "react"; import { DndProvider } from "react-dnd"; import { HTML5Backend } from "react-dnd-html5-backend"; -import { Outlet, useLocation, useNavigate } from "react-router-dom"; +import { Outlet, useLocation } from "react-router-dom"; import { DocumentResource } from "../../store/DocumentResource"; -import { getStoreService } from "../../store/local/stores"; -import { CloseNewPageDialog, IsNewPageDialogOpen } from "../routes/routes"; -import { Navigation } from "./components/Navigation"; -import NewPageDialog from "./components/NewPageDialog"; +import { SessionStore } from "../../store/local/SessionStore"; import styles from "./Main.module.css"; +import { Navigation } from "./components/Navigation"; + +const Main = observer((props: { sessionStore: SessionStore }) => { + const location = useLocation(); + // const navigate = useNavigate(); + + const [top, setTop] = useState(true); + + const controlNavbar = useCallback(() => { + if (typeof window !== "undefined") { + if (window.scrollY > 0) { + setTop(false); + } else { + setTop(true); + } + } + }, []); -const Main = observer((props: {}) => { - const sessionStore = getStoreService().sessionStore; + useEffect(() => { + if (typeof window !== "undefined") { + window.addEventListener("scroll", controlNavbar); - let location = useLocation(); - let navigate = useNavigate(); + // cleanup function + return () => { + window.removeEventListener("scroll", controlNavbar); + }; + } + }, [controlNavbar]); return (
- + className={classNames( + styles.main, + top && styles.top, + (location.pathname === "/" || location.pathname === "/ai") && + styles.homepage, + location.pathname === "/ai" && styles.ai + )}> + - {sessionStore.loggedInUserId && ( - CloseNewPageDialog(navigate)} - isOpen={IsNewPageDialogOpen(location)} - /> - )}
); @@ -43,4 +55,5 @@ const Main = observer((props: {}) => { export default Main; +// eslint-disable-next-line @typescript-eslint/no-explicit-any (window as any).DocumentResource = DocumentResource; // TODO: hacky diff --git a/packages/editor/src/app/main/components/Navigation.tsx b/packages/editor/src/app/main/components/Navigation.tsx index 552da1daf..e2f563d8d 100644 --- a/packages/editor/src/app/main/components/Navigation.tsx +++ b/packages/editor/src/app/main/components/Navigation.tsx @@ -1,14 +1,13 @@ /* eslint-disable jsx-a11y/anchor-is-valid */ -import { - AtlassianNavigation, - PrimaryButton, -} from "@atlaskit/atlassian-navigation"; +import { AtlassianNavigation } from "@atlaskit/atlassian-navigation"; +import Button from "@atlaskit/button"; import { observer } from "mobx-react-lite"; +import { useCallback } from "react"; import { VscSignIn } from "react-icons/vsc"; import { Link, useLocation, useNavigate } from "react-router-dom"; -import { getStoreService } from "../../../store/local/stores"; -import { toDocs, toLoginScreen } from "../../routes/routes"; +import { SessionStore } from "../../../store/local/SessionStore"; +import { toDocs, toLoginScreen, toRegisterScreen } from "../../routes/routes"; import { Logo } from "./Logo"; import styles from "./Navigation.module.css"; import { ProfilePopup } from "./ProfilePopup"; @@ -17,17 +16,22 @@ const ProductHome = () => { return ( <> - Alpha preview + {/* beta */}
); }; -export const Navigation = observer(() => { - const sessionStore = getStoreService().sessionStore; +export const Navigation = observer((props: { sessionStore: SessionStore }) => { + const { sessionStore } = props; const navigate = useNavigate(); const location = useLocation(); + const isLoggedIn = sessionStore.isLoggedIn; + const renderProfile = useCallback(() => { + return <>{isLoggedIn && }; + }, [isLoggedIn, sessionStore]); + return ( { Documentation GitHub @@ -48,13 +53,7 @@ export const Navigation = observer(() => { // Documentation // , ]} - renderProfile={observer(() => ( - <> - {sessionStore.isLoggedIn && ( - - )} - - ))} + renderProfile={renderProfile} // renderHelp={() => ( // // Documentation @@ -63,19 +62,35 @@ export const Navigation = observer(() => { renderSignIn={observer(() => ( <> {!sessionStore.isLoggedIn && ( - - navigate(toLoginScreen(), { state: { from: location } }) - } - iconBefore={ - - }> - {" "} - Sign in{" "} - {/* {typeof sessionStore.user === "string" + <> + + + )} ))} diff --git a/packages/editor/src/app/main/components/NewPageDialog.tsx b/packages/editor/src/app/main/components/NewPageDialog.tsx index db9c1787b..394354f8c 100644 --- a/packages/editor/src/app/main/components/NewPageDialog.tsx +++ b/packages/editor/src/app/main/components/NewPageDialog.tsx @@ -8,12 +8,13 @@ import Modal, { ModalTransition, } from "@atlaskit/modal-dialog"; import Textfield from "@atlaskit/textfield"; +import { error as errorUtil } from "@typecell-org/util"; import { useState } from "react"; import { useNavigate } from "react-router-dom"; import * as Y from "yjs"; import { BaseResource } from "../../../store/BaseResource"; import { DocConnection } from "../../../store/DocConnection"; -import { UnreachableCaseError } from "../../../util/UnreachableCaseError"; +import { SessionStore } from "../../../store/local/SessionStore"; import { toDocument } from "../../routes/routes"; import { Card } from "./common/card/Card"; import { CardContainer } from "./common/card/CardContainer"; @@ -22,6 +23,7 @@ export const NewPageDialog = (props: { isOpen: boolean; close: () => void; ownerId: string; + sessionStore: SessionStore; }) => { const [loading, setLoading] = useState(false); const [selectedType, setSelectedType] = useState<"!richtext" | "!notebook">( @@ -41,6 +43,7 @@ export const NewPageDialog = (props: { // TODO: format title? e.preventDefault(); const data = new FormData(e.target as HTMLFormElement); + // eslint-disable-next-line @typescript-eslint/no-explicit-any const obj: any = {}; data.forEach((val, key) => { obj[key] = val; @@ -50,10 +53,7 @@ export const NewPageDialog = (props: { setError(""); setLoading(true); - const ret = await DocConnection.create({ - owner: props.ownerId, - document: obj.title, - }); + const ret = await DocConnection.create(props.sessionStore); setLoading(false); @@ -62,11 +62,12 @@ export const NewPageDialog = (props: { case "already-exists": setWarning("A page with this title already exists"); break; - case "invalid-identifier": - setWarning("Invalid title"); + case "error": + setError("Unknown error while creating new document."); + console.error(ret); break; default: - throw new UnreachableCaseError(ret); + throw new errorUtil.UnreachableCaseError(ret); } } else if (ret instanceof BaseResource) { if (selectedType === "!richtext") { @@ -84,15 +85,17 @@ export const NewPageDialog = (props: { ret.doc.data.insert(0, [blockgroup]); } else if (selectedType === "!notebook") { - ret.create("!notebook"); - ret.doc.cellList.addCell(0, "markdown", "# " + obj.title); - ret.doc.cellList.addCell( - 1, - "typescript", - `export let message = "Hello World"` - ); + // TODO + throw new Error("not implemented"); + // ret.create("!notebook"); + // ret.doc.cellList.addCell(0, "markdown", "# " + obj.title); + // ret.doc.cellList.addCell( + // 1, + // "typescript", + // `export let message = "Hello World"` + // ); } else { - throw new UnreachableCaseError(selectedType); + throw new errorUtil.UnreachableCaseError(selectedType); } navigate(toDocument(ret)); @@ -102,13 +105,9 @@ export const NewPageDialog = (props: { // so it's nice to make sure we don't dispose it beforehand (and prevent a reload) setTimeout(() => { ret.dispose(); - }, 500); + }, 50000); // TODO } else { - if (ret.status !== "error") { - throw new UnreachableCaseError(ret.status); - } - console.error(ret); - setError("Unknown error while creating new document."); + throw new errorUtil.UnreachableCaseError(ret); } // setName(obj.name); // setIsOpen(false); diff --git a/packages/editor/src/app/main/components/NotebookOverview.module.css b/packages/editor/src/app/main/components/NotebookOverview.module.css deleted file mode 100644 index 7c7a37670..000000000 --- a/packages/editor/src/app/main/components/NotebookOverview.module.css +++ /dev/null @@ -1,40 +0,0 @@ -.room { - padding: 8px 12px; - border-radius: 4px; - box-shadow: var( - --ds-card, - 0 1px 1px rgba(9, 30, 66, 0.25), - 0 0 1px 0 rgba(9, 30, 66, 0.31) - ); - margin: 4px; -} - -.room .roomName { - font-size: 1em; -} - -.room .user { - font-size: 0.8em; -} - -.notebookList { - margin-top: 4px; - width: 100%; - display: flex; - flex-direction: row; - flex-wrap: wrap; - max-height: 600px; - align-content: flex-start; -} - -.notebookList > * { - width: calc(25% - 8px); -} - -/* 900px is an arbitrary number, but make sure it's the same as the width - for determining notebookListLimit in NotebookOverview.tsx */ -@media screen and (max-width: 731px) { - .notebookList > * { - width: calc(50% - 8px); - } -} diff --git a/packages/editor/src/app/main/components/NotebookOverview.tsx b/packages/editor/src/app/main/components/NotebookOverview.tsx deleted file mode 100644 index 23e3f1254..000000000 --- a/packages/editor/src/app/main/components/NotebookOverview.tsx +++ /dev/null @@ -1,172 +0,0 @@ -import Textfield from "@atlaskit/textfield"; -import { Method } from "matrix-js-sdk"; -import { observer } from "mobx-react-lite"; -import { useEffect, useState } from "react"; -import { Link } from "react-router-dom"; -import { parseIdentifier } from "../../../identifiers"; -import { getStoreService } from "../../../store/local/stores"; -import { toIdentifier } from "../../routes/routes"; -import styles from "./NotebookOverview.module.css"; - -type Room = { - name: string; - user: string; - fullName: string; - server: string; -}; - -function parseRoomFromAlias(rawAlias: string): Room | undefined { - var regex = new RegExp("#(.*)/(.*):(.*)", "g"); - const match = regex.exec(rawAlias); - - if (!match) { - return undefined; - } - - const user = match[1]; - const name = match[2]; - const server = match[3]; - - return { - name, - user, - server, - fullName: `${user}/${name}`, - }; -} - -const RoomInfo = function (props: { room: Room }) { - return ( -
- - {props.room.name} - -
{props.room.user}
- {/*
{props.server}
*/} -
- ); -}; - -type NotebookOverviewProps = { - owner: string; -}; - -/** - * Notebook Overview - * - * Currently, we directly fetch notebooks from Matrix. - * What would a local-first version of this look like? Perhaps we have to create Yjs document that's - * an index of all the notebooks per user - */ -export const NotebookOverview = observer(function ( - props: NotebookOverviewProps -) { - const [loading, setLoading] = useState(false); - const [rooms, setRooms] = useState([]); - - const [searchString, setSearchString] = useState(""); - - const sessionStore = getStoreService().sessionStore; - - useEffect(() => { - // async function resolveRoom(roomId: string): Promise { - // const result = await matrixClient.http.authedRequest( - // undefined, - // "GET", - // `/rooms/${roomId}/aliases`, - // ) - - // const rawAlias = result.aliases[0] as string; - - // return parseRoomFromAlias(rawAlias); - // } - - async function fetchNotebooks() { - try { - setLoading(true); - - if (typeof sessionStore.user === "string") { - sessionStore.enableGuest(); - return; - } - // A user's own rooms - // const result = await matrixClient.getJoinedRooms(); - - // const promises = result.joined_rooms.map(async (roomId: string) => await resolveRoom(roomId)); - - // Resolve room aliases and filter undefined values - // const resolvedRooms = await (await Promise.all(promises)).filter(r => r).map(r => r as Room); - - // Currently we limit search to Public rooms by this user - const matrixClient = sessionStore.user.matrixClient; - - const result = await matrixClient.http.authedRequest( - undefined as any, - Method.Post, - `/publicRooms`, - undefined, - { - filter: { - generic_search_term: props.owner + "/", - }, - } - ); - - // console.log(result); - - const resolvedRooms: Room[] = (result.chunk as any[]) - .map((res: any) => parseRoomFromAlias(res.canonical_alias)) - .filter( - (r: Room | undefined): r is Room => !!r && r.user === props.owner - ) - .sort((a, b) => a.fullName.localeCompare(b.fullName)); - - setRooms(resolvedRooms); - - setLoading(false); - } catch (error) { - setLoading(true); - } - } - - fetchNotebooks(); - }, [sessionStore, sessionStore.user, props.owner]); - - const notebookList = rooms ? ( - <> - {rooms - .filter((r) => r.name.includes(searchString)) - .map((room) => ( - - ))} - - ) : ( - [] - ); - - if ( - sessionStore.user === "loading" || - sessionStore.user === "offlineNoUser" - ) { - return
Loading...
; - } - - return ( -
- {/*
{props.owner}'s notebooks
*/} - -
- {loading ? "Fetching notebooks..." : notebookList} -
-
- ); -}); diff --git a/packages/editor/src/app/main/components/NotebookOverviewItem.module.css b/packages/editor/src/app/main/components/NotebookOverviewItem.module.css deleted file mode 100644 index bfb7a1e86..000000000 --- a/packages/editor/src/app/main/components/NotebookOverviewItem.module.css +++ /dev/null @@ -1,90 +0,0 @@ -.item { - text-align: left; - width: 100%; -} - -.item a:hover { - text-decoration: none; -} - -.item p { - /* border-left: 3px solid #efefef; */ - display: block; - /* padding: 0.5em 0 0.5em 1em; */ - font-size: 1em; -} - -.previewImage { - margin-bottom: 1em; - overflow: hidden; - border-radius: 3px; - border: 1px solid #ececec; -} - -.previewImage img { - display: block; - width: 100%; -} - -.item:first-child { - padding-left: 0; -} - -.item:last-child { - padding-right: 0; -} - -.item h3 { - font-size: 1.1em; - color: #676767; - font-weight: 600; - width: 100%; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.item .bottom { - margin-top: 1em; - display: flex; - align-items: center; - justify-content: space-between; -} - -.owner { - display: flex; - align-items: center; -} - -.owner .profileImage { - overflow: hidden; - border-radius: 100%; - height: 30px; - width: 30px; - margin-right: 0.8em; -} - -.owner > span { - color: #676767; - font-weight: 600; -} - -.owner > span:hover { - color: #676767; -} - -.profileImage div { - background-color: #36aed4; - text-align: center; - height: 100%; - width: 100%; -} - -.profileImage div span { - color: white; - line-height: 30px; -} - -.username { - text-transform: capitalize; -} diff --git a/packages/editor/src/app/main/components/NotebookOverviewItem.tsx b/packages/editor/src/app/main/components/NotebookOverviewItem.tsx deleted file mode 100644 index 0584a57de..000000000 --- a/packages/editor/src/app/main/components/NotebookOverviewItem.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { observer } from "mobx-react-lite"; -import { Link, To } from "react-router-dom"; -import buttonStyles from "../../../styles/buttons.module.css"; -import { toProfilePage } from "../../routes/routes"; -import styles from "./NotebookOverviewItem.module.css"; - -export const NotebookOverviewItem = observer( - (props: { - title: string; - description: string; - previewImage: string; - to: To; - author: { username: string; profileImageUrl?: string }; - }) => { - return ( -
-
- - Notebook preview - -
-
-

{props.title}

-

{props.description}

-
-
- -
- {props.author.profileImageUrl ? ( - Notebook author - ) : ( -
- {props.author.username.charAt(0).toUpperCase()} -
- )} -
- {props.author.username} - - - - View - -
-
- ); - } -); diff --git a/packages/editor/src/app/main/components/Profile.tsx b/packages/editor/src/app/main/components/Profile.tsx index 2a0f7c153..1d96e14bc 100644 --- a/packages/editor/src/app/main/components/Profile.tsx +++ b/packages/editor/src/app/main/components/Profile.tsx @@ -1,12 +1,14 @@ import Breadcrumbs, { BreadcrumbsItem } from "@atlaskit/breadcrumbs"; import { useNavigate } from "react-router-dom"; +import { SessionStore } from "../../../store/local/SessionStore"; + import { toProfilePage } from "../../routes/routes"; -import { MenuBar } from "./menuBar/MenuBar"; -import { NotebookOverview } from "./NotebookOverview"; import styles from "./Profile.module.css"; +import { MenuBar } from "./menuBar/MenuBar"; interface ProfileProps { owner: string; + sessionStore: SessionStore; } export const Profile = function (props: ProfileProps) { @@ -26,7 +28,10 @@ export const Profile = function (props: ProfileProps) {
- + {/* */}
); diff --git a/packages/editor/src/app/main/components/ProfilePopup.tsx b/packages/editor/src/app/main/components/ProfilePopup.tsx index 165c61cc5..8a73cb825 100644 --- a/packages/editor/src/app/main/components/ProfilePopup.tsx +++ b/packages/editor/src/app/main/components/ProfilePopup.tsx @@ -7,33 +7,30 @@ import { observer } from "mobx-react-lite"; import Avatar from "react-avatar"; import { useNavigate } from "react-router-dom"; import { SessionStore } from "../../../store/local/SessionStore"; -import { getStoreService } from "../../../store/local/stores"; -import { OpenNewPageDialog } from "../../routes/routes"; +import { toProfilePage } from "../../routes/routes"; export const ProfilePopup = observer( (props: { sessionStore: SessionStore }) => { const navigate = useNavigate(); - const navigationStore = getStoreService().navigationStore; /* TODO: props.authStore.user!.firebase.photoURL! */ return ( { - const { triggerRef, isSelected, testId, ...passProps } = props; + spacing="compact" + trigger={(innerProps) => { + const { triggerRef, isSelected, testId, ...passProps } = innerProps; return ( } - ref={props.triggerRef} + ref={triggerRef} {...passProps} // icon={} tooltip="" @@ -41,14 +38,18 @@ export const ProfilePopup = observer( ); }} placement="bottom-end"> - OpenNewPageDialog(navigate)}> + {/* OpenNewPageDialog(navigate)}> New page - - {navigationStore.menuPortalChildren.map((c) => c.children)} - - {" "} + */} + {/* @${props.authStore.user?.username} */} - {/* Profile */} + { + navigate(toProfilePage("@" + props.sessionStore.loggedInUserId)); + }}> + Profile + {/* Account settings */} Sign out diff --git a/packages/editor/src/app/main/components/common/card/CardContainer.tsx b/packages/editor/src/app/main/components/common/card/CardContainer.tsx index 8639063a6..4d4b31a91 100644 --- a/packages/editor/src/app/main/components/common/card/CardContainer.tsx +++ b/packages/editor/src/app/main/components/common/card/CardContainer.tsx @@ -1,5 +1,5 @@ import styles from "./CardContainer.module.css"; -export const CardContainer = (props: { children: any }) => { +export const CardContainer = (props: { children: React.ReactNode }) => { return
{props.children}
; }; diff --git a/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx b/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx index 151c9d336..c64855aa5 100644 --- a/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx +++ b/packages/editor/src/app/main/components/documentMenu/Breadcrumb.tsx @@ -1,159 +1,98 @@ import Breadcrumbs, { BreadcrumbsItem } from "@atlaskit/breadcrumbs"; +import { observer } from "mobx-react-lite"; +import { useContext } from "react"; import { VscFile, VscGithub, VscGlobe } from "react-icons/vsc"; -import { useNavigate, useOutletContext } from "react-router-dom"; -import { path } from "vscode-lib"; +import { useNavigate } from "react-router-dom"; import { FileIdentifier } from "../../../../identifiers/FileIdentifier"; import { GithubIdentifier } from "../../../../identifiers/GithubIdentifier"; import { HttpsIdentifier } from "../../../../identifiers/HttpsIdentifier"; import { Identifier } from "../../../../identifiers/Identifier"; -import { MatrixIdentifier } from "../../../../identifiers/MatrixIdentifier"; -import { toProfilePage } from "../../../routes/routes"; +import { identifiersToPath } from "../../../../identifiers/paths/identifierPathHelpers"; +import { DocConnection } from "../../../../store/DocConnection"; +import ProfileResource from "../../../../store/ProfileResource"; +import { SessionStore } from "../../../../store/local/SessionStore"; +import { RouteContext } from "../../../routes/RouteContext"; -const buttonStyle = { - alignItems: "baseline", - borderWidth: 0, - display: "inline-flex", - maxWidth: "100%", - textDecoration: "none", - background: "none", - height: "auto", - lineHeight: "inherit", - padding: 0, - verticalAlign: "baseline", - width: "auto", - justifyContent: "center", - fontWeight: 400, - minWidth: 0, -}; +function getTitleForIdentifier( + identifier: Identifier, + sessionStore: SessionStore +) { + const doc = DocConnection.get(identifier, sessionStore); + if (doc) { + switch (doc.tryDoc?.type) { + case "!project": + return doc.tryDoc.title || "Untitled"; + // return "public workspace"; + case "!profile": + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return doc.tryDoc!.getSpecificType(ProfileResource).title; + case "!notebook": + case "!richtext": + case "!document": + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return doc.tryDoc!.doc.title || "Untitled"; + default: + return "…"; + } + } + return "…"; +} -const BreadcrumbItems = (props: { identifier: Identifier }) => { +const BreadcrumbItems = observer((props: { sessionStore: SessionStore }) => { const items: JSX.Element[] = []; const navigate = useNavigate(); - const identifier = props.identifier; - const toRoot = () => { - if (identifier.title === "Docs") { - navigate({ - pathname: "/docs", - }); - } else { - navigate({ - pathname: "/" + identifier.toString(), - }); - } - }; + const { groups } = useContext(RouteContext); - if (identifier instanceof FileIdentifier) { - // Show path as single item - items.push( - } - text={identifier.title || identifier.uri.toString()} - onClick={toRoot} - /> - ); - } else if (identifier instanceof GithubIdentifier) { - // Show path as single item - items.push( - } - href="" - onClick={toRoot} - text={identifier.title || identifier.uri.toString()} - /> - ); - } else if (identifier instanceof HttpsIdentifier) { - // Show path as single item - items.push( - } - href="" - text={identifier.title || identifier.uri.toString()} - onClick={toRoot} - /> - ); - } else if (identifier instanceof MatrixIdentifier) { - items.push( - { - navigate(toProfilePage(identifier.owner)); - }} - />, - ( - // Replace default component so it doesn't render as a link - - )} - /> - ); - } + groups.forEach((identifiers) => { + // const lastIdentifier = identifiers[identifiers.length - 1]; - return <>{[...items]}; -}; + identifiers.forEach((identifier, i) => { + // let component: any; -export const Breadcrumb = (props: { identifier: Identifier }) => { - const parentId = (useOutletContext() as any)?.parentIdentifier as - | Identifier - | undefined; - const navigate = useNavigate(); + // if (i === identifiers.length - 1) { + // component = () => ( + // // Replace default component so it doesn't render as a link + // + // ); + // } + let icon; + if (i === 0) { + if (identifier instanceof HttpsIdentifier) { + icon = ; + } else if (identifier instanceof FileIdentifier) { + icon = ; + } else if (identifier instanceof GithubIdentifier) { + icon = ; + } + } - if (parentId) { - let parentPart = parentId.toString(); - if (parentPart.endsWith("index.json")) { - // TODO: hacky to fix here, this is for the http loader - parentPart = parentPart.substring( - 0, - parentPart.length - "index.json".length + const path = "/" + identifiersToPath(identifiers.slice(0, i + 1)); + items.push( + { + e.preventDefault(); + navigate(path); + }} + /> ); - } - if (!props.identifier.toString().startsWith(parentPart)) { - throw new Error("unexpected parent identifier"); - } - - const subOnly = props.identifier.toString().substring(parentPart.length); - - const parts = subOnly.split("/"); - const subItems: JSX.Element[] = []; - while (parts.length) { - const link = - parentId.title === "Docs" - ? path.join("/docs", ...parts) - : "/" + path.join(parentPart, ":", ...parts); + }); + }); - const part = parts.pop()!; - if (part.length) { - subItems.push( - { - navigate({ pathname: link }); - e.preventDefault(); - }} - /> - ); - } - } - subItems.reverse(); - return ( - - {parentId && } - {[...subItems]} - - ); - } + return <>{[...items]}; +}); +export const Breadcrumb = (props: { sessionStore: SessionStore }) => { return ( - + ); }; diff --git a/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx b/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx index 79186fb36..a00b1d71a 100644 --- a/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx +++ b/packages/editor/src/app/main/components/documentMenu/DocumentMenu.tsx @@ -11,21 +11,26 @@ import { MatrixIdentifier } from "../../../../identifiers/MatrixIdentifier"; import { openAsMarkdown } from "../../../../integrations/markdown/export"; import { DocumentResource } from "../../../../store/DocumentResource"; import { SessionStore } from "../../../../store/local/SessionStore"; -import { getStoreService } from "../../../../store/local/stores"; import { ClosePermissionsDialog, IsPermissionsDialogOpen, OpenPermissionsDialog, } from "../../../routes/routes"; import { MenuBar } from "../menuBar/MenuBar"; -import PermissionsDialog from "../permissions/PermissionsDialog"; + +import { HttpsIdentifier } from "../../../../identifiers/HttpsIdentifier"; +import { TypeCellIdentifier } from "../../../../identifiers/TypeCellIdentifier"; +import ProjectResource from "../../../../store/ProjectResource"; +import { SupabaseSessionStore } from "../../../supabase-auth/SupabaseSessionStore"; +import SupabasePermissionsDialog from "../../../supabase-auth/routes/permissions/PermissionsDialog"; import { Breadcrumb } from "./Breadcrumb"; import styles from "./DocumentMenu.module.css"; import { ForkAlert } from "./ForkAlert"; import { ShareButton } from "./ShareButton"; type Props = { - document: DocumentResource; + document: DocumentResource | ProjectResource; + sessionStore: SessionStore; }; // TODO: move? @@ -33,26 +38,56 @@ function userCanEditPermissions( sessionStore: SessionStore, identifier: Identifier ) { + if (identifier instanceof HttpsIdentifier) { + return false; + } if (identifier && identifier instanceof MatrixIdentifier) { return sessionStore.loggedInUserId === identifier.owner; } - return false; + return true; + // TODO + // if (identifier && identifier instanceof TypeCellIdentifier) { + // return sessionStore.loggedInUserId === identifier.owner; + // } + // return false; } export const DocumentMenu: React.FC = observer((props) => { - const sessionStore = getStoreService().sessionStore; + const { sessionStore } = props; const canEditPermissions = userCanEditPermissions( sessionStore, props.document.identifier ); - let location = useLocation(); - let navigate = useNavigate(); + const location = useLocation(); + const navigate = useNavigate(); + + let permissionsArea: React.ReactElement = <>; + if (canEditPermissions) { + if ( + props.document.identifier instanceof TypeCellIdentifier && + sessionStore instanceof SupabaseSessionStore + ) { + permissionsArea = ( + ClosePermissionsDialog(navigate)} + isOpen={IsPermissionsDialogOpen(location)} + identifier={props.document.identifier} + sessionStore={sessionStore} + /> + ); + } else { + throw new Error("unexpected types"); + } + } + return ( - - {props.document.connection!.needsFork && ( - - )} + + + {props.document.needsFork && + props.document instanceof DocumentResource && ( + + )} - {canEditPermissions && ( - ClosePermissionsDialog(navigate)} - isOpen={IsPermissionsDialogOpen(location)} - connection={props.document.connection!} - /> - )} + {canEditPermissions && permissionsArea} ); }); diff --git a/packages/editor/src/app/main/components/documentMenu/ForkAlert.tsx b/packages/editor/src/app/main/components/documentMenu/ForkAlert.tsx index 6cee84744..fe5e5ed11 100644 --- a/packages/editor/src/app/main/components/documentMenu/ForkAlert.tsx +++ b/packages/editor/src/app/main/components/documentMenu/ForkAlert.tsx @@ -1,69 +1,72 @@ +import { when } from "mobx"; import { observer } from "mobx-react-lite"; import { VscWarning } from "react-icons/vsc"; import { Link, useLocation, useNavigate } from "react-router-dom"; -import { BaseResource } from "../../../../store/BaseResource"; import { DocumentResource } from "../../../../store/DocumentResource"; -import { getStoreService } from "../../../../store/local/stores"; -import { UnreachableCaseError } from "../../../../util/UnreachableCaseError"; -import { toDocument, toLoginScreen } from "../../../routes/routes"; -import styles from "./ForkAlert.module.css"; -export const ForkAlert = observer((props: { document: DocumentResource }) => { - /* eslint-disable jsx-a11y/anchor-is-valid */ - const sessionStore = getStoreService().sessionStore; - const navigate = useNavigate(); - const location = useLocation(); +import { SessionStore } from "../../../../store/local/SessionStore"; +import { toDocument, toRegisterScreen } from "../../../routes/routes"; +import styles from "./ForkAlert.module.css"; - if (!props.document.connection?.needsFork) { - throw new Error(" but no fork needed"); - } +export const ForkAlert = observer( + (props: { document: DocumentResource; sessionStore: SessionStore }) => { + /* eslint-disable jsx-a11y/anchor-is-valid */ + const { sessionStore } = props; + const navigate = useNavigate(); + const location = useLocation(); - const forkAction = sessionStore.isLoggedIn ? ( -
{ - e.preventDefault(); - if (!props.document.connection) { - throw new Error("unexpected, forking without currentDocument"); - } - const result = await props.document.connection.fork(); - if (result instanceof BaseResource) { - navigate(toDocument(result)); - } else { - if (result.status !== "error") { - throw new UnreachableCaseError(result.status); - } - throw new Error("error while forking"); - } - return false; - }}> - save a copy - - ) : ( - - sign in to save a copy - - ); + if (!props.document.needsFork) { + throw new Error(" but no fork needed"); + } - return ( - - ); -}); + ) : ( + + sign up to save a copy + + ); + + return ( + + ); + } +); diff --git a/packages/editor/src/app/main/components/documentMenu/index.tsx b/packages/editor/src/app/main/components/documentMenu/index.tsx deleted file mode 100644 index ca12a2716..000000000 --- a/packages/editor/src/app/main/components/documentMenu/index.tsx +++ /dev/null @@ -1,3 +0,0 @@ -import { DocumentMenu } from "./DocumentMenu"; - -export default DocumentMenu; diff --git a/packages/editor/src/app/main/components/menuBar/MenuBar.module.css b/packages/editor/src/app/main/components/menuBar/MenuBar.module.css index 7f9f44207..d9da56ab2 100644 --- a/packages/editor/src/app/main/components/menuBar/MenuBar.module.css +++ b/packages/editor/src/app/main/components/menuBar/MenuBar.module.css @@ -9,7 +9,7 @@ justify-content: space-between; position: sticky; top: 0; - z-index: 99; + /* z-index: 99; */ } /* Targets atlaskit Breadcrumb separators */ diff --git a/packages/editor/src/app/main/components/menuBar/MenuBar.tsx b/packages/editor/src/app/main/components/menuBar/MenuBar.tsx index 320deb48f..8cbba7fea 100644 --- a/packages/editor/src/app/main/components/menuBar/MenuBar.tsx +++ b/packages/editor/src/app/main/components/menuBar/MenuBar.tsx @@ -2,7 +2,7 @@ import React from "react"; import styles from "./MenuBar.module.css"; type Props = { - children: any; + children: React.ReactNode; }; export const MenuBar: React.FC = (props) => { diff --git a/packages/editor/src/app/main/components/permissions/MatrixUserPicker.tsx b/packages/editor/src/app/main/components/permissions/MatrixUserPicker.tsx deleted file mode 100644 index 6b5c5ee90..000000000 --- a/packages/editor/src/app/main/components/permissions/MatrixUserPicker.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import UserPicker from "@atlaskit/user-picker"; -import { useCallback, useState } from "react"; -import { IntlProvider } from "react-intl-next"; -import { friendlyUserId } from "../../../../util/userIds"; -import { MatrixClientPeg } from "../../../matrix-auth/MatrixClientPeg"; -import { User } from "./userUtils"; - -export function MatrixUserPicker(props: { - // excludeUserId: string; - updateSelectedUser: (user: User | undefined) => void; -}) { - const updateSelectedUser = props.updateSelectedUser; - // State and function for storing & updating the users to display in the user picker. - const [displayedUsers, setDisplayedUsers] = useState([]); - - async function searchUsers(query: string = "") { - const peg = MatrixClientPeg.get(); - - if (!peg || query === "") { - setDisplayedUsers([]); - } else { - const ret = await peg.searchUserDirectory({ - term: query || "mx", // mx is a trick to return all users on mx.typecell.org - limit: 10, - }); - - const results: User[] = ret.results - // .filter((result: any) => result.display_name !== props.excludeUserId) - .map((result: any) => ({ - id: result.user_id, - name: friendlyUserId(result.user_id), - })); - - setDisplayedUsers(results); - } - } - - const onChange = useCallback( - (user: User | User[] | null | undefined) => { - if (Array.isArray(user)) { - throw new Error("unexpected"); - } - updateSelectedUser(user || undefined); - }, - [updateSelectedUser] - ); - - return ( - - null} - onInputChange={searchUsers} - onChange={onChange} - options={displayedUsers} - menuPosition="fixed" - /> - - ); -} diff --git a/packages/editor/src/app/main/components/permissions/PermissionsLoader.tsx b/packages/editor/src/app/main/components/permissions/PermissionsLoader.tsx deleted file mode 100644 index a3af15281..000000000 --- a/packages/editor/src/app/main/components/permissions/PermissionsLoader.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import Modal, { - ModalBody, - ModalHeader, - ModalTitle, -} from "@atlaskit/modal-dialog"; -import Spinner from "@atlaskit/spinner"; -import { getMatrixRoomAccess, MatrixMemberReader } from "matrix-crdt"; -import { observer } from "mobx-react-lite"; -import { useEffect, useState } from "react"; -import { DocConnection } from "../../../../store/DocConnection"; -import PermissionSettings from "./PermissionsSettings"; -import styles from "./PermissionsSettings.module.css"; -import { PermissionData, UserPermission } from "./permissionUtils"; - -const PermissionsLoader = observer( - (props: { - document: DocConnection; - user: string | undefined; - matrixClient: any; - closeCallback: () => void; - currentUserId: string; - }) => { - const [permissionData, setPermissionData] = useState< - PermissionData | undefined - >(); - - useEffect(() => { - const mxProvider = props.document.matrixProvider!; - const mxReader = props.document.matrixProvider?.matrixReader!; - if (!mxProvider || !mxReader || !mxProvider.roomId) { - throw new Error("MatrixProvider / MatrixReader not available"); - } - async function initReader() { - const roomSettings = await getMatrixRoomAccess( - props.matrixClient, - mxProvider.roomId! - ); - if (typeof roomSettings !== "string") { - throw new Error("unexpected roomSettings" + roomSettings); - } - const mreader = new MatrixMemberReader(props.matrixClient, mxReader); - await mreader.initialize(); - - const entries = [...mreader.members.values()].map((u) => { - const ret: [string, UserPermission] = [ - u.user_id, - mreader.hasWriteAccess(u.user_id, "org.typecell.doc_update") - ? "edit" - : "view", - ]; - return ret; - }); - mreader.dispose(); - setPermissionData({ - doc: roomSettings, - users: new Map(entries), - }); - } - initReader(); - return () => { - setPermissionData(undefined); - }; - }, [ - props.document, - props.document.matrixProvider?.matrixReader, - props.matrixClient, - ]); - - if (!permissionData) { - return ( - - - Sharing & Permissions - - -
- -
-
-
- ); - } - - const mxProvider = props.document.matrixProvider!; - if (!mxProvider || !mxProvider.roomId) { - throw new Error("roomId not available"); - } - - return ( - - ); - } -); - -export default PermissionsLoader; diff --git a/packages/editor/src/app/main/components/permissions/permissionUtils.ts b/packages/editor/src/app/main/components/permissions/permissionUtils.ts deleted file mode 100644 index ed0dee27d..000000000 --- a/packages/editor/src/app/main/components/permissions/permissionUtils.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { updateMatrixRoomAccess } from "matrix-crdt"; - -export type DocPermission = "public-read-write" | "public-read" | "private"; - -export type UserPermission = "view" | "edit"; - -export const docPermissionLabels = new Map([ - ["public-read-write", "Anyone can view and edit"], - ["public-read", "Anyone can view, some can edit"], - ["private", "Only some can view or edit (coming in beta)"], -]); - -export const userPermissionLabels = new Map([ - ["view", "Can view"], - ["edit", "Can edit"], -]); - -export type PermissionData = { - doc: DocPermission; - users: Map; -}; - -/** - * Diffs the changes between existing room permission data `old` and - * `newPermissions`. Then applies the changes to the room. - */ -export async function updatePermissionData( - matrixClient: any, - roomId: string, - old: PermissionData, - newPermissions: PermissionData -) { - if (old.doc !== newPermissions.doc) { - if (newPermissions.doc === "private") { - throw new Error("not implemented"); - } - await updateMatrixRoomAccess(matrixClient, roomId, newPermissions.doc); - } - if (newPermissions.doc === "public-read-write") { - // for public documents, the user permissions are irrelevant and don't need to be updated - return; - } - - for (let [userId, permission] of old.users) { - const newValue = newPermissions.users.get(userId); - if (!newValue || newValue !== permission) { - if (newValue === "edit") { - // invite + set permission - await matrixClient.invite(roomId, userId); - } else { - // kick - await matrixClient.kick(roomId, userId); - } - } - } - - for (let [userId, permission] of newPermissions.users) { - const oldValue = old.users.get(userId); - if (!oldValue) { - if (permission === "edit") { - // invite + set permission - await matrixClient.invite(roomId, userId); - } - } - } -} diff --git a/packages/editor/src/app/main/components/startscreen/AILanding.tsx b/packages/editor/src/app/main/components/startscreen/AILanding.tsx index 852795cbe..2dc624ed8 100644 --- a/packages/editor/src/app/main/components/startscreen/AILanding.tsx +++ b/packages/editor/src/app/main/components/startscreen/AILanding.tsx @@ -1,25 +1,23 @@ import { observer } from "mobx-react-lite"; -import { useNavigate } from "react-router-dom"; -import { getStoreService } from "../../../../store/local/stores"; +import { SessionStore } from "../../../../store/local/SessionStore"; import buttonStyles from "../../../../styles/buttons.module.css"; -import { OpenNewPageDialog, toNewGuestNotebook } from "../../../routes/routes"; +import styles from "./StartScreen.module.css"; import globe from "./assets/globe.svg"; import intro from "./assets/intro.gif"; import lightning from "./assets/lightning.svg"; import npm from "./assets/npm.svg"; -import styles from "./StartScreen.module.css"; -export const AILanding = observer(() => { - const { sessionStore } = getStoreService(); - const navigate = useNavigate(); - function onNewNotebookClick(e: any) { - e.preventDefault(); - if (sessionStore.isLoggedIn) { - OpenNewPageDialog(navigate); - } else { - navigate(toNewGuestNotebook()); - } - } +export const AILanding = observer((props: { sessionStore: SessionStore }) => { + // const { sessionStore } = props; + // const navigate = useNavigate(); + // function onNewNotebookClick(e: any) { + // e.preventDefault(); + // if (sessionStore.isLoggedIn) { + // OpenNewPageDialog(navigate); + // } else { + // navigate(toNewGuestNotebook()); + // } + // } return ( <> diff --git a/packages/editor/src/app/main/components/startscreen/StartScreen.module.css b/packages/editor/src/app/main/components/startscreen/StartScreen.module.css index a62097fc6..78ebe7546 100644 --- a/packages/editor/src/app/main/components/startscreen/StartScreen.module.css +++ b/packages/editor/src/app/main/components/startscreen/StartScreen.module.css @@ -74,7 +74,8 @@ } .perks { - max-width: 1200px; + font-size: 16px; + max-width: var(--content-max-width); margin: 0 auto; /* padding: 4em 0; */ /* position: relative; */ @@ -85,7 +86,7 @@ flex: 0 0 auto; gap: 20px; grid-auto-rows: min-content; - grid-template-columns: repeat(3, minmax(200px, 1fr)); + grid-template-columns: repeat(4, minmax(200px, 1fr)); grid-template-rows: repeat(2, min-content); justify-content: center; } @@ -103,19 +104,25 @@ flex: 0 0 auto; place-self: start; text-align: left; - padding: 40px; - box-shadow: rgb(0 0 0 / 25%) 0px 10px 30px -20px; + padding: 30px; + box-shadow: rgb(0 0 0 / 25%) 0px 1px 3px -2px; + border-radius: 20px; border: 1px solid rgba(0, 0, 0, 0.08); width: 100%; height: 100%; position: relative; + transition: box-shadow 0.16s ease; +} + +.perks .perk:hover { + box-shadow: rgb(0 0 0 / 25%) 0px 10px 30px -20px; } .perk h3 { font-weight: 600; margin: 0.5em 0; - font-size: 1.8em; + font-size: 1.3em; } .perks .perk .icon { @@ -187,8 +194,8 @@ } form { -margin: 0; -display: contents; + margin: 0; + display: contents; } button { @@ -325,3 +332,232 @@ button { padding: 3em 1em; } } + +:root { + --content-max-width: 1480px; +} + +.header { + position: relative; + display: flex; + gap: 84px; + width: var(--content-max-width); + max-width: 100%; + margin: 0 auto 52px; + padding: 0 52px; + padding-top: 226px; +} + +@media (max-width: 1280px) { + .header { + gap: 64px; + padding-right: 32px; + } +} +@media (max-width: 1024px) { + .header { + flex-direction: column; + align-items: center; + padding-top: 150px; + } +} +@media (max-width: 500px) { + .header { + padding: 0 12px; + } +} + +.headerContent { + flex: 1.2; + position: relative; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + gap: 32px; +} + +@media (max-width: 1024px) { + .headerContent { + align-items: center; + } +} + +.headerMedia { + display: flex; + flex-direction: column; + /* transform: translateY(-80px); */ + max-width: 696px; + width: 100%; +} + +@media (max-width: 1460px) { + .headerMedia { + width: 44%; + } +} +@media (max-width: 1280px) { + .headerMedia { + width: 48%; + } +} +@media (max-width: 1024px) { + .headerMedia { + width: 100%; + transform: translateY(0); + } +} + +@media only screen and (hover: none) and (pointer: coarse) { + .headerMedia { + display: none; /* disable on mobile */ + } +} + +.header .icon { + width: 160px; + height: 160px; + /* color: var(--sb-foreground-highlight); */ + /* -webkit-mask-image: $icon-mask; + mask-image: $icon-mask; + + @media (prefers-contrast: more) { + display: none; + } + + @media (min-width: $bp-medium) { + width: 200px; + height: 200px; + } */ +} + +.header h1 { + margin-bottom: 0; + font-family: Gilroy, var(--vp-font-family-base); + line-height: 1.2; + font-weight: 400; + margin-top: -25px; + font-size: 76px; + letter-spacing: -2px; + line-height: 1; + color: #000; + :root.dark & { + color: #fff; + } + + strong { + font-weight: 600; + } +} + +@media (max-width: 1400px) { + .header h1 { + font-size: 68px; + } +} +@media (max-width: 1280px) { + .header h1 { + font-size: 60px; + } +} +@media (max-width: 1024px) { + .header h1 { + text-align: center; + } +} +@media (max-width: 960px) { + .header h1 { + font-size: 40px; + } +} + +.header p { + max-width: 600px; + margin: 0.75em 0 1.5em; + font-size: 18px; + font-weight: 500; + line-height: 1.6; +} + +@media (max-width: 1280px) { + .header p { + font-size: 16px; + } +} +@media (max-width: 1024px) { + .header p { + margin-bottom: 12px; + text-align: center; + } +} +@media (max-width: 960px) { + .header p { + font-size: 16px; + } +} + +.ctaButtons { + --vp-c-text-light-1: rgba(60, 60, 67); + --vp-c-text-light-2: rgba(60, 60, 67, 0.75); + --vp-c-text-light-3: rgba(60, 60, 67, 0.33); + --vp-c-text-1: var(--vp-c-text-light-1); + --vp-c-text-2: var(--vp-c-text-light-2); + --vp-c-text-3: var(--vp-c-text-light-3); + --vp-c-brand: hsl(200 80% 38%); + --vp-c-brand-light: hsl(195 85% 42%); + --vp-c-brand-lighter: hsl(190 90% 48%); + display: flex; + gap: 16px; + width: 100%; +} + +@media (max-width: 1024px) { + .ctaButtons { + justify-content: center; + } +} + +.ctaButtons a { + --border-thickness: 1px; + display: flex; + align-items: center; + justify-content: center; + height: 72px; + width: min(100%, 300px); + padding: 4px 8px; + border-radius: 38px; + line-height: 1.4; + font-size: 15px; + font-weight: 700; + color: var(--vp-c-text-1); + --border-thickness: 2px; + box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.1), + inset 0 0 0 var(--border-thickness) var(--vp-c-text-1); + backdrop-filter: blur(4px); + transition: 0.16s ease; + transition-property: background-color, border-color, box-shadow, color, + transform; +} + +.ctaButtons a:hover { + --border-thickness: 1px; + background-color: #fff; + box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.1), + inset 0 0 0 var(--border-thickness) var(--vp-c-brand-lighter), + 0 0 24px -10px var(--vp-c-brand-lighter); + transform: translateY(-2px); + text-decoration: none; + color: var(--vp-c-text-1); +} +.ctaButtons a.simple { + width: min(100%, 200px); + text-underline-offset: 2px; + box-shadow: none !important; + text-decoration: underline; + background-color: transparent !important; + backdrop-filter: none; +} + +.ctaButtons a.simple:hover { + color: var(--vp-c-brand); +} diff --git a/packages/editor/src/app/main/components/startscreen/StartScreen.tsx b/packages/editor/src/app/main/components/startscreen/StartScreen.tsx index 085d66eaa..dc30e45f7 100644 --- a/packages/editor/src/app/main/components/startscreen/StartScreen.tsx +++ b/packages/editor/src/app/main/components/startscreen/StartScreen.tsx @@ -1,27 +1,37 @@ import { observer } from "mobx-react-lite"; -import { Link, useNavigate } from "react-router-dom"; -import { getStoreService } from "../../../../store/local/stores"; +import { useEffect } from "react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { SessionStore } from "../../../../store/local/SessionStore"; import buttonStyles from "../../../../styles/buttons.module.css"; +// import { NotebookOverviewItem } from "../../../matrix-auth/routes/overview/NotebookOverviewItem"; import { OpenNewPageDialog, toDocs, - toIdentifierString, toNewGuestNotebook, toTutorial, } from "../../../routes/routes"; -import { NotebookOverviewItem } from "../NotebookOverviewItem"; -import apiPreviewImage from "./assets/api_preview.jpg"; -import chartsPreviewImage from "./assets/charts_preview.jpg"; +import styles from "./StartScreen.module.css"; import globe from "./assets/globe.svg"; import intro from "./assets/intro.gif"; import lightning from "./assets/lightning.svg"; import npm from "./assets/npm.svg"; -import timePreviewImage from "./assets/time_preview.jpg"; -import styles from "./StartScreen.module.css"; -export const StartScreen = observer(() => { - const { sessionStore } = getStoreService(); +export const StartScreen = observer((props: { sessionStore: SessionStore }) => { + const { sessionStore } = props; const navigate = useNavigate(); + const location = useLocation(); + + useEffect(() => { + if (location.pathname === "/" && sessionStore.loggedInUserId) { + // logged in, redirect to main workspace. + // homepage is still accessible via /home + navigate({ + pathname: "/@" + sessionStore.loggedInUserId + "/public", + }); + } + }, [location.pathname, sessionStore.loggedInUserId, navigate]); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any function onNewNotebookClick(e: any) { e.preventDefault(); if (sessionStore.isLoggedIn) { @@ -33,17 +43,38 @@ export const StartScreen = observer(() => { return ( <> +
+
+

+ Interactive documents. Reimagined. +
+

+ {/* */} +

+ TypeCell is a fresh take on what documents and software can look + like. Think Notion + Jupyter Notebooks. Open Source. +

+
+ Try interactive tutorial + + Create new notebook + + {/* Create your workspace (beta) */} + {/* */} +
+
+
+
+ TypeCell Demo +
+
+
-
- {/*
- - Star - -
*/} + {/*

Create & share live interactive notebooks

@@ -70,7 +101,7 @@ export const StartScreen = observer(() => { TypeCell Demo
-
+
*/}
@@ -137,7 +168,7 @@ export const StartScreen = observer(() => {
- { username: "niklas", profileImageUrl: "", }} - to={toIdentifierString( - "@niklas/time" - )}> + + }> */}
- { username: "yousef", profileImageUrl: "", }} - to={toIdentifierString( - "@yousef/charts" - )}> + + }> */}
- { username: "niklas", profileImageUrl: "", }} - to={toIdentifierString("@niklas/api")}> + to={ + "TODO" + }> */}
diff --git a/packages/editor/src/app/matrix-auth/AuthStoreUtil.ts b/packages/editor/src/app/matrix-auth/AuthStoreUtil.ts deleted file mode 100644 index 055adb3ca..000000000 --- a/packages/editor/src/app/matrix-auth/AuthStoreUtil.ts +++ /dev/null @@ -1,396 +0,0 @@ -import { IMatrixClientCreds } from "./auth/util/matrix"; -import { IStoredSession } from "./MatrixAuthStore"; -import createMatrixClient from "./createMatrixClient"; -import * as StorageManager from "./StorageManager"; -import { idbLoad, idbSave } from "./StorageManager"; -import { encryptAES } from "./unexported/aes"; -import { base64 } from "@typecell-org/common"; -import { MatrixClient } from "matrix-js-sdk"; - -const HOMESERVER_URL_KEY = "mx_hs_url"; -const ID_SERVER_URL_KEY = "mx_is_url"; - -// Source: https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L754 -export function isSoftLogout(): boolean { - return localStorage.getItem("mx_soft_logout") === "true"; -} - -// https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L376 -export async function abortLogin() { - const signOut = true; //await showStorageEvictedDialog(); - if (signOut) { - await clearStorage(); - // This error feels a bit clunky, but we want to make sure we don't go any - // further and instead head back to sign in. - throw new Error( - "Aborting login in progress because of storage inconsistency" - ); - } -} - -/** - * @param {object} opts Options for how to clear storage. - * @returns {Promise} promise which resolves once the stores have been cleared - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L843 - */ -export async function clearStorage(opts?: { - deleteEverything?: boolean; -}): Promise { - if (window.localStorage) { - // try to save any 3pid invites from being obliterated - // const pendingInvites = ThreepidInviteStore.instance.getWireInvites(); - - window.localStorage.clear(); - - try { - await StorageManager.idbDelete("account", "mx_access_token"); - } catch (e) {} - - // now restore those invites - if (!opts?.deleteEverything) { - // pendingInvites.forEach((i) => { - // const roomId = i.roomId; - // delete i.roomId; // delete to avoid confusing the store - // ThreepidInviteStore.instance.storeInvite(roomId, i); - // }); - } - } - - if (window.sessionStorage) { - window.sessionStorage.clear(); - } - - // create a temporary client to clear out the persistent stores. - const cli = createMatrixClient({ - // we'll never make any requests, so can pass a bogus HS URL - baseUrl: "", - }); - - // await EventIndexPeg.deleteEventIndex(); - await cli.clearStores(); -} - -/** - * Get a previously stored pickle key. The pickle key is used for - * encrypting libolm objects. - * @param {string} userId the user ID for the user that the pickle key is for. - * @param {string} userId the device ID that the pickle key is for. - * @returns {string|null} the previously stored pickle key, or null if no - * pickle key has been stored. - */ -export async function getPickleKey( - userId: string, - deviceId: string -): Promise { - if (!window.crypto || !window.crypto.subtle) { - return undefined; - } - let data; - try { - data = await idbLoad("pickleKey", [userId, deviceId]); - } catch (e) {} - if (!data) { - return undefined; - } - if (!data.encrypted || !data.iv || !data.cryptoKey) { - console.error("Badly formatted pickle key"); - return undefined; - } - - const additionalData = new Uint8Array(userId.length + deviceId.length + 1); - for (let i = 0; i < userId.length; i++) { - additionalData[i] = userId.charCodeAt(i); - } - additionalData[userId.length] = 124; // "|" - for (let i = 0; i < deviceId.length; i++) { - additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); - } - - try { - const key = await crypto.subtle.decrypt( - { name: "AES-GCM", iv: data.iv, additionalData }, - data.cryptoKey, - data.encrypted - ); - return base64.encodeUnpaddedBase64(key); - } catch (e) { - console.error("Error decrypting pickle key"); - return undefined; - } -} - -/** - * Create and store a pickle key for encrypting libolm objects. - * @param {string} userId the user ID for the user that the pickle key is for. - * @param {string} userId the device ID that the pickle key is for. - * @returns {string|null} the pickle key, or null if the platform does not - * support storing pickle keys. - */ -export async function createPickleKey( - userId: string, - deviceId: string -): Promise { - if (!window.crypto || !window.crypto.subtle) { - return null; - } - const crypto = window.crypto; - const randomArray = new Uint8Array(32); - crypto.getRandomValues(randomArray); - const cryptoKey = await crypto.subtle.generateKey( - { name: "AES-GCM", length: 256 }, - false, - ["encrypt", "decrypt"] - ); - const iv = new Uint8Array(32); - crypto.getRandomValues(iv); - - const additionalData = new Uint8Array(userId.length + deviceId.length + 1); - for (let i = 0; i < userId.length; i++) { - additionalData[i] = userId.charCodeAt(i); - } - additionalData[userId.length] = 124; // "|" - for (let i = 0; i < deviceId.length; i++) { - additionalData[userId.length + 1 + i] = deviceId.charCodeAt(i); - } - - const encrypted = await crypto.subtle.encrypt( - { name: "AES-GCM", iv, additionalData }, - cryptoKey, - randomArray - ); - - try { - await idbSave("pickleKey", [userId, deviceId], { - encrypted, - iv, - cryptoKey, - }); - } catch (e) { - return null; - } - return base64.encodeUnpaddedBase64(randomArray); -} - -// The pickle key is a string of unspecified length and format. For AES, we -// need a 256-bit Uint8Array. So we HKDF the pickle key to generate the AES -// key. The AES key should be zeroed after it is used. -export async function pickleKeyToAesKey( - pickleKey: string -): Promise { - const pickleKeyBuffer = new Uint8Array(pickleKey.length); - for (let i = 0; i < pickleKey.length; i++) { - pickleKeyBuffer[i] = pickleKey.charCodeAt(i); - } - const hkdfKey = await window.crypto.subtle.importKey( - "raw", - pickleKeyBuffer, - "HKDF", - false, - ["deriveBits"] - ); - pickleKeyBuffer.fill(0); - return new Uint8Array( - await window.crypto.subtle.deriveBits( - { - name: "HKDF", - hash: "SHA-256", - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore: https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/879 - salt: new Uint8Array(32), - info: new Uint8Array(0), - }, - hkdfKey, - 256 - ) - ); -} - -export async function persistCredentials( - credentials: IMatrixClientCreds -): Promise { - localStorage.setItem(HOMESERVER_URL_KEY, credentials.homeserverUrl); - if (credentials.identityServerUrl) { - localStorage.setItem(ID_SERVER_URL_KEY, credentials.identityServerUrl); - } - localStorage.setItem("mx_user_id", credentials.userId); - localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest)); - - // store whether we expect to find an access token, to detect the case - // where IndexedDB is blown away - if (credentials.accessToken) { - localStorage.setItem("mx_has_access_token", "true"); - } else { - localStorage.deleteItem("mx_has_access_token"); - } - - if (credentials.pickleKey) { - let encryptedAccessToken; - try { - // try to encrypt the access token using the pickle key - const encrKey = await pickleKeyToAesKey(credentials.pickleKey); - encryptedAccessToken = await encryptAES( - credentials.accessToken, - encrKey, - "access_token" - ); - encrKey.fill(0); - } catch (e) { - console.warn("Could not encrypt access token", e); - } - try { - // save either the encrypted access token, or the plain access - // token if we were unable to encrypt (e.g. if the browser doesn't - // have WebCrypto). - await StorageManager.idbSave( - "account", - "mx_access_token", - encryptedAccessToken || credentials.accessToken - ); - } catch (e) { - // if we couldn't save to indexedDB, fall back to localStorage. We - // store the access token unencrypted since localStorage only saves - // strings. - localStorage.setItem("mx_access_token", credentials.accessToken); - } - localStorage.setItem("mx_has_pickle_key", String(true)); - } else { - try { - await StorageManager.idbSave( - "account", - "mx_access_token", - credentials.accessToken - ); - } catch (e) { - localStorage.setItem("mx_access_token", credentials.accessToken); - } - if (localStorage.getItem("mx_has_pickle_key")) { - console.error( - "Expected a pickle key, but none provided. Encryption may not work." - ); - } - } - - // if we didn't get a deviceId from the login, leave mx_device_id unset, - // rather than setting it to "undefined". - // - // (in this case MatrixClient doesn't bother with the crypto stuff - // - that's fine for us). - if (credentials.deviceId) { - localStorage.setItem("mx_device_id", credentials.deviceId); - } - - // SecurityCustomisations.persistCredentials?.(credentials); - - console.log(`Session persisted for ${credentials.userId}`); -} - -/** - * Retrieves information about the stored session from the browser's storage. The session - * may not be valid, as it is not tested for consistency here. - * @returns {Object} Information about the session - see implementation for variables. - */ -export async function getStoredSessionVars(): Promise { - const hsUrl = localStorage.getItem(HOMESERVER_URL_KEY); - const isUrl = localStorage.getItem(ID_SERVER_URL_KEY); - let accessToken; - try { - accessToken = await StorageManager.idbLoad("account", "mx_access_token"); - } catch (e) {} - if (!accessToken) { - accessToken = localStorage.getItem("mx_access_token"); - if (accessToken) { - try { - // try to migrate access token to IndexedDB if we can - await StorageManager.idbSave("account", "mx_access_token", accessToken); - localStorage.removeItem("mx_access_token"); - } catch (e) {} - } - } - // if we pre-date storing "mx_has_access_token", but we retrieved an access - // token, then we should say we have an access token - const hasAccessToken = - localStorage.getItem("mx_has_access_token") === "true" || !!accessToken; - const userId = localStorage.getItem("mx_user_id"); - const deviceId = localStorage.getItem("mx_device_id"); - - let isGuest; - if (localStorage.getItem("mx_is_guest") !== null) { - isGuest = localStorage.getItem("mx_is_guest") === "true"; - } else { - // legacy key name - isGuest = localStorage.getItem("matrix-is-guest") === "true"; - } - - return { - hsUrl: hsUrl!, // TODO: fix ! - isUrl: isUrl!, // TODO: fix ! - hasAccessToken, - accessToken, - userId: userId!, // TODO: fix ! - deviceId: deviceId!, // TODO: fix ! - isGuest, - }; -} - -/** - * Gets the user ID of the persisted session, if one exists. This does not validate - * that the user's credentials still work, just that they exist and that a user ID - * is associated with them. The session is not loaded. - * @returns {[String, bool]} The persisted session's owner and whether the stored - * session is for a guest user, if an owner exists. If there is no stored session, - * return undefined. - */ -export async function getStoredSessionOwner(): Promise< - [string, boolean] | undefined -> { - const { hsUrl, userId, hasAccessToken, isGuest } = - await getStoredSessionVars(); - return hsUrl && userId && hasAccessToken ? [userId, isGuest] : undefined; -} - -function getSSOCallbackUrl(pageAfterLogin?: string): URL { - return pageAfterLogin - ? new URL(pageAfterLogin) - : new URL(window.location.href); - // const url = new URL(window.location.href); - // url.hash = pageAfterLogin || ""; - // return url; -} - -export const SSO_HOMESERVER_URL_KEY = "mx_sso_hs_url"; -export const SSO_ID_SERVER_URL_KEY = "mx_sso_is_url"; -export const SSO_IDP_ID_KEY = "mx_sso_idp_id"; - -/** - * Begin Single Sign On flows. - * @param {MatrixClient} mxClient the matrix client using which we should start the flow - * @param {"sso"|"cas"} loginType the type of SSO it is, CAS/SSO. - * @param {string} fragmentAfterLogin the hash to pass to the app during sso callback. - * @param {string} idpId The ID of the Identity Provider being targeted, optional. - */ -export function startSingleSignOn( - mxClient: MatrixClient, - loginType: "sso" | "cas", - fragmentAfterLogin?: string, - idpId?: string -) { - // persist hs url and is url for when the user is returned to the app with the login token - localStorage.setItem(SSO_HOMESERVER_URL_KEY, mxClient.getHomeserverUrl()); - if (mxClient.getIdentityServerUrl()) { - localStorage.setItem( - SSO_ID_SERVER_URL_KEY, - mxClient.getIdentityServerUrl() - ); - } - if (idpId) { - localStorage.setItem(SSO_IDP_ID_KEY, idpId); - } - - const callbackUrl = getSSOCallbackUrl(fragmentAfterLogin); - window.location.href = mxClient.getSsoLoginUrl( - callbackUrl.toString(), - loginType, - idpId - ); // redirect to SSO -} diff --git a/packages/editor/src/app/matrix-auth/DESIGN.md b/packages/editor/src/app/matrix-auth/DESIGN.md deleted file mode 100644 index 47373344a..000000000 --- a/packages/editor/src/app/matrix-auth/DESIGN.md +++ /dev/null @@ -1,96 +0,0 @@ -Primary goals of integrating Matrix and TypeCell: - -- Central storage of documents when there are no Peers online -- (Future) support for end-to-end encryption (e2ee) -- Support for permissions / groups / organizations via Matrix Rooms and Spaces -- Find users / documents clients are not aware of yet - -Secondary goals: - -- good for enterprises? (can host on premises, SSO support) -- federation (decentralized web) - -NOT a goal: centralized source-of-truth of Yjs documents. We want to stick with the offline-first / distributed model as long as possible. This means all document-based operations (create / edit / delete? docs) should be possible when the user or server is offline. - -# Use cases (public documents) - -## creating a document - -1. Create document on server - - a. if fail because Offline. Proceed to 2 - - b. if fail for other reason, fail (and show to user) - - c. If success, proceed to 3 - -2. Offline: - - a. Create document using y-indexeddb - - b. Save document to `PendingMatrixCreate` - -3. Load document with y-indexeddb - -## viewing a document - -We don't need to join a room to view public documents. Instead, we can use PeekRoom to retrieve updates and stay updated. Additionally, we can use a public WebRTC signalling server to connect to peers and retrieve updates in real-time. - -1. Get document from server (by alias) - -2. Verify Alias owner - -## editing a document - -For public documents, we can send updates over both WebRTC connection and MatrixProvider connection (on a slower rate). TODO: figure out if we need to join the room first. - -if offline? - -## deleting a document - -1. Delete document on server - - a. if fail because Offline. Proceed to 2 - - b. if fail for other reason, fail (and show to user) - - c. if success, proceed to 3 - -2. Offline: - - a. Delete document using y-indexeddb - - b. Save document to `PendingMatrixDelete` - -3. Delete document from y-indexeddb - -_PendingMatrixCreate_ - -1. On startup, create rooms for `PendingMatrixCreate` queue: - - a. if failing because offline: keep in queue - - b. if fail for other reasons then offline (no access, duplicate): delete y-indexeddb document (perhaps make a copy "tombstone") - - c. if success: establish a connection with the room and sync y-indexeddb document to it - -_PendingMatrixDelete_ - -_logout_ - -_login_ - -# Documents, URIs and Spaces - -- Documents are identified by a URI of `/`. -- The Matrix equivalent of a document is a Room. -- A user has the id to his _root space_ in his userProfile under the key `typecell_space` -- Only the owner of this _root space_ can add / remove documents from it -- Rooms are aliased with TypeCell URIs `/`. -- When resolving a TypeCell URI to a room, we MUST verify that it was created by ``. Because at this moment we don't reserve the alias `/` on the server, so in theory it could be created by someone else. (Later, we can prevent this using a Matrix Application Server). - -TODO: - -documents by default read-public, write-private? - -Proof of write-access by posting public-key in channel periodically diff --git a/packages/editor/src/app/matrix-auth/IdentityAuthClient.ts b/packages/editor/src/app/matrix-auth/IdentityAuthClient.ts deleted file mode 100644 index b01c1c467..000000000 --- a/packages/editor/src/app/matrix-auth/IdentityAuthClient.ts +++ /dev/null @@ -1,192 +0,0 @@ -/* -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { createClient, SERVICE_TYPES } from "matrix-js-sdk"; - -import { MatrixClientPeg } from "./MatrixClientPeg"; - -import { Service, startTermsFlow, TermsNotSignedError } from "./Terms"; - -export class AbortedIdentityActionError extends Error {} - -export default class IdentityAuthClient { - private accessToken: any; - private authEnabled; - private tempClient: any; - /** - * Creates a new identity auth client - * @param {string} identityUrl The URL to contact the identity server with. - * When provided, this class will operate solely within memory, refusing to - * persist any information such as tokens. Default null (not provided). - */ - constructor(identityUrl: string | null = null) { - this.accessToken = null; - this.authEnabled = true; - - if (identityUrl) { - // XXX: We shouldn't have to create a whole new MatrixClient just to - // do identity server auth. The functions don't take an identity URL - // though, and making all of them take one could lead to developer - // confusion about what the idBaseUrl does on a client. Therefore, we - // just make a new client and live with it. - this.tempClient = createClient({ - baseUrl: "", // invalid by design - idBaseUrl: identityUrl, - }); - } else { - // Indicates that we're using the real client, not some workaround. - this.tempClient = null; - } - } - - get _matrixClient() { - return this.tempClient ? this.tempClient : MatrixClientPeg.get(); - } - - _writeToken() { - if (this.tempClient) return; // temporary client: ignore - window.localStorage.setItem("mx_is_access_token", this.accessToken); - } - - _readToken() { - if (this.tempClient) return null; // temporary client: ignore - return window.localStorage.getItem("mx_is_access_token"); - } - - hasCredentials() { - return this.accessToken != null; // undef or null - } - - // Returns a promise that resolves to the access_token string from the IS - async getAccessToken({ check = true } = {}) { - if (!this.authEnabled) { - // The current IS doesn't support authentication - return null; - } - - let token = this.accessToken; - if (!token) { - token = this._readToken(); - } - - if (!token) { - token = await this.registerForToken(check); - if (token) { - this.accessToken = token; - this._writeToken(); - } - return token; - } - - if (check) { - try { - await this._checkToken(token); - } catch (e) { - if ( - e instanceof TermsNotSignedError || - e instanceof AbortedIdentityActionError - ) { - // Retrying won't help this - throw e; - } - // Retry in case token expired - token = await this.registerForToken(); - if (token) { - this.accessToken = token; - this._writeToken(); - } - } - } - - return token; - } - - async _checkToken(token: string) { - const identityServerUrl = this._matrixClient.getIdentityServerUrl(); - - try { - await this._matrixClient.getIdentityAccount(token); - } catch (e: any) { - if (e.errcode === "M_TERMS_NOT_SIGNED") { - console.log("Identity Server requires new terms to be agreed to"); - await startTermsFlow([ - new Service(SERVICE_TYPES.IS, identityServerUrl, token), - ]); - return; - } - throw e; - } - - throw new Error("no terms on server"); - // if ( - // !this.tempClient && - // !doesAccountDataHaveIdentityServer() && - // !(await doesIdentityServerHaveTerms(identityServerUrl)) - // ) { - // const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - // const { finished } = Modal.createTrackedDialog( - // "Default identity server terms warning", - // "", - // QuestionDialog, - // { - // title: _t("Identity server has no terms of service"), - // description: ( - //
- //

- // {_t( - // "This action requires accessing the default identity server " + - // " to validate an email address or phone number, " + - // "but the server does not have any terms of service.", - // {}, - // { - // server: () => {abbreviateUrl(identityServerUrl)}, - // } - // )} - //

- //

{_t("Only continue if you trust the owner of the server.")}

- //
- // ), - // button: _t("Trust"), - // } - // ); - // const [confirmed] = await finished; - // if (confirmed) { - // // eslint-disable-next-line react-hooks/rules-of-hooks - // useDefaultIdentityServer(); - // } else { - // throw new AbortedIdentityActionError( - // "User aborted identity server action without terms" - // ); - // } - // } - - // We should ensure the token in `localStorage` is cleared - // appropriately. We already clear storage on sign out, but we'll need - // additional clearing when changing ISes in settings as part of future - // privacy work. - // See also https://github.com/vector-im/element-web/issues/10455. - } - - async registerForToken(check = true) { - const hsOpenIdToken = await MatrixClientPeg.get().getOpenIdToken(); - // XXX: The spec is `token`, but we used `access_token` for a Sydent release. - const { access_token: accessToken, token } = - await this._matrixClient.registerWithIdentityServer(hsOpenIdToken); - const identityAccessToken = token ? token : accessToken; - if (check) await this._checkToken(identityAccessToken); - return identityAccessToken; - } -} diff --git a/packages/editor/src/app/matrix-auth/Lifecycle.ts.bak b/packages/editor/src/app/matrix-auth/Lifecycle.ts.bak deleted file mode 100644 index e88c5b5af..000000000 --- a/packages/editor/src/app/matrix-auth/Lifecycle.ts.bak +++ /dev/null @@ -1,993 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 Vector Creations Ltd -Copyright 2018 New Vector Ltd -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { - createClient, - InvalidStoreError, - MatrixClient, - decryptAES, - encryptAES, -} from "matrix-js-sdk"; - -import { - SSO_HOMESERVER_URL_KEY, - SSO_ID_SERVER_URL_KEY, - SSO_IDP_ID_KEY, -} from "./BasePlatform"; -import { MatrixClientPeg } from "./MatrixClientPeg"; - -const HOMESERVER_URL_KEY = "mx_hs_url"; -const ID_SERVER_URL_KEY = "mx_is_url"; - -interface ILoadSessionOpts { - enableGuest?: boolean; - guestHsUrl?: string; - guestIsUrl?: string; - ignoreGuest?: boolean; - defaultDeviceDisplayName?: string; - fragmentQueryParams?: Record; -} - -/** - * Called at startup, to attempt to build a logged-in Matrix session. It tries - * a number of things: - * - * 1. if we have a guest access token in the fragment query params, it uses - * that. - * 2. if an access token is stored in local storage (from a previous session), - * it uses that. - * 3. it attempts to auto-register as a guest user. - * - * If any of steps 1-4 are successful, it will call {_doSetLoggedIn}, which in - * turn will raise on_logged_in and will_start_client events. - * - * @param {object} [opts] - * @param {object} [opts.fragmentQueryParams]: string->string map of the - * query-parameters extracted from the #-fragment of the starting URI. - * @param {boolean} [opts.enableGuest]: set to true to enable guest access - * tokens and auto-guest registrations. - * @param {string} [opts.guestHsUrl]: homeserver URL. Only used if enableGuest - * is true; defines the HS to register against. - * @param {string} [opts.guestIsUrl]: homeserver URL. Only used if enableGuest - * is true; defines the IS to use. - * @param {bool} [opts.ignoreGuest]: If the stored session is a guest account, - * ignore it and don't load it. - * @param {string} [opts.defaultDeviceDisplayName]: Default display name to use - * when registering as a guest. - * @returns {Promise} a promise which resolves when the above process completes. - * Resolves to `true` if we ended up starting a session, or `false` if we - * failed. - */ -export async function loadSession( - opts: ILoadSessionOpts = {} -): Promise { - try { - let enableGuest = opts.enableGuest || false; - const guestHsUrl = opts.guestHsUrl; - const guestIsUrl = opts.guestIsUrl; - const fragmentQueryParams = opts.fragmentQueryParams || {}; - const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; - - if (enableGuest && !guestHsUrl) { - console.warn("Cannot enable guest access: can't determine HS URL to use"); - enableGuest = false; - } - - if ( - enableGuest && - fragmentQueryParams.guest_user_id && - fragmentQueryParams.guest_access_token - ) { - console.log("Using guest access credentials"); - return doSetLoggedIn( - { - userId: fragmentQueryParams.guest_user_id, - accessToken: fragmentQueryParams.guest_access_token, - homeserverUrl: guestHsUrl, - identityServerUrl: guestIsUrl, - guest: true, - }, - true - ).then(() => true); - } - const success = await restoreFromLocalStorage({ - ignoreGuest: Boolean(opts.ignoreGuest), - }); - if (success) { - return true; - } - - if (enableGuest) { - if (!guestHsUrl || !guestIsUrl || !defaultDeviceDisplayName) { - throw new Error("enable guest with invalid params"); - } - return registerAsGuest(guestHsUrl, guestIsUrl, defaultDeviceDisplayName); - } - - // fall back to welcome screen - return false; - } catch (e) { - if (e instanceof AbortLoginAndRebuildStorage) { - // If we're aborting login because of a storage inconsistency, we don't - // need to show the general failure dialog. Instead, just go back to welcome. - return false; - } - return handleLoadSessionFailure(e); - } -} - -/** - * Gets the user ID of the persisted session, if one exists. This does not validate - * that the user's credentials still work, just that they exist and that a user ID - * is associated with them. The session is not loaded. - * @returns {[String, bool]} The persisted session's owner and whether the stored - * session is for a guest user, if an owner exists. If there is no stored session, - * return undefined. - */ -export async function getStoredSessionOwner(): Promise< - [string, boolean] | undefined -> { - const { hsUrl, userId, hasAccessToken, isGuest } = - await getStoredSessionVars(); - return hsUrl && userId && hasAccessToken ? [userId, isGuest] : undefined; -} - -/** - * @param {Object} queryParams string->string map of the - * query-parameters extracted from the real query-string of the starting - * URI. - * - * @param {string} defaultDeviceDisplayName - * @param {string} fragmentAfterLogin path to go to after a successful login, only used for "Try again" - * - * @returns {Promise} promise which resolves to true if we completed the token - * login, else false - */ -export function attemptTokenLogin( - queryParams: Record, - defaultDeviceDisplayName?: string, - fragmentAfterLogin?: string -): Promise { - if (!queryParams.loginToken) { - return Promise.resolve(false); - } - - const homeserver = localStorage.getItem(SSO_HOMESERVER_URL_KEY); - const identityServer = localStorage.getItem(SSO_ID_SERVER_URL_KEY); - if (!homeserver) { - console.warn("Cannot log in with token: can't determine HS URL to use"); - Modal.createTrackedDialog("SSO", "Unknown HS", ErrorDialog, { - title: _t("We couldn't log you in"), - description: _t( - "We asked the browser to remember which homeserver you use to let you sign in, " + - "but unfortunately your browser has forgotten it. Go to the sign in page and try again." - ), - button: _t("Try again"), - }); - return Promise.resolve(false); - } - - return sendLoginRequest(homeserver, identityServer, "m.login.token", { - token: queryParams.loginToken, - initial_device_display_name: defaultDeviceDisplayName, - }) - .then(function (creds) { - console.log("Logged in with token"); - return clearStorage().then(async () => { - await persistCredentials(creds); - // remember that we just logged in - sessionStorage.setItem("mx_fresh_login", String(true)); - return true; - }); - }) - .catch((err) => { - Modal.createTrackedDialog("SSO", "Token Rejected", ErrorDialog, { - title: _t("We couldn't log you in"), - description: - err.name === "ConnectionError" - ? _t( - "Your homeserver was unreachable and was not able to log you in. Please try again. " + - "If this continues, please contact your homeserver administrator." - ) - : _t( - "Your homeserver rejected your log in attempt. " + - "This could be due to things just taking too long. Please try again. " + - "If this continues, please contact your homeserver administrator." - ), - button: _t("Try again"), - onFinished: (tryAgain) => { - if (tryAgain) { - const cli = createClient({ - baseUrl: homeserver, - idBaseUrl: identityServer, - }); - const idpId = localStorage.getItem(SSO_IDP_ID_KEY) || undefined; - PlatformPeg.get().startSingleSignOn( - cli, - "sso", - fragmentAfterLogin, - idpId - ); - } - }, - }); - console.error("Failed to log in with login token:"); - console.error(err); - return false; - }); -} - -export function handleInvalidStoreError(e: InvalidStoreError): Promise { - if (e.reason === InvalidStoreError.TOGGLED_LAZY_LOADING) { - return Promise.resolve() - .then(() => { - const lazyLoadEnabled = e.value; - if (lazyLoadEnabled) { - const LazyLoadingResyncDialog = sdk.getComponent( - "views.dialogs.LazyLoadingResyncDialog" - ); - return new Promise((resolve) => { - Modal.createDialog(LazyLoadingResyncDialog, { - onFinished: resolve, - }); - }); - } else { - // show warning about simultaneous use - // between LL/non-LL version on same host. - // as disabling LL when previously enabled - // is a strong indicator of this (/develop & /app) - const LazyLoadingDisabledDialog = sdk.getComponent( - "views.dialogs.LazyLoadingDisabledDialog" - ); - return new Promise((resolve) => { - Modal.createDialog(LazyLoadingDisabledDialog, { - onFinished: resolve, - host: window.location.host, - }); - }); - } - }) - .then(() => { - return MatrixClientPeg.get().store.deleteAllData(); - }) - .then(() => { - PlatformPeg.get().reload(); - }); - } -} - -function registerAsGuest( - hsUrl: string, - isUrl: string, - defaultDeviceDisplayName: string -): Promise { - console.log(`Doing guest login on ${hsUrl}`); - - // create a temporary MatrixClient to do the login - const client = createClient({ - baseUrl: hsUrl, - }); - - return client - .registerGuest({ - body: { - initial_device_display_name: defaultDeviceDisplayName, - }, - }) - .then( - (creds) => { - console.log(`Registered as guest: ${creds.user_id}`); - return doSetLoggedIn( - { - userId: creds.user_id, - deviceId: creds.device_id, - accessToken: creds.access_token, - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - guest: true, - }, - true - ).then(() => true); - }, - (err) => { - console.error("Failed to register as guest", err); - return false; - } - ); -} - -export interface IStoredSession { - hsUrl: string; - isUrl: string; - hasAccessToken: boolean; - accessToken: string | object; - userId: string; - deviceId: string; - isGuest: boolean; -} - -/** - * Retrieves information about the stored session from the browser's storage. The session - * may not be valid, as it is not tested for consistency here. - * @returns {Object} Information about the session - see implementation for variables. - */ -export async function getStoredSessionVars(): Promise { - const hsUrl = localStorage.getItem(HOMESERVER_URL_KEY); - const isUrl = localStorage.getItem(ID_SERVER_URL_KEY); - let accessToken; - try { - accessToken = await StorageManager.idbLoad("account", "mx_access_token"); - } catch (e) {} - if (!accessToken) { - accessToken = localStorage.getItem("mx_access_token"); - if (accessToken) { - try { - // try to migrate access token to IndexedDB if we can - await StorageManager.idbSave("account", "mx_access_token", accessToken); - localStorage.removeItem("mx_access_token"); - } catch (e) {} - } - } - // if we pre-date storing "mx_has_access_token", but we retrieved an access - // token, then we should say we have an access token - const hasAccessToken = - localStorage.getItem("mx_has_access_token") === "true" || !!accessToken; - const userId = localStorage.getItem("mx_user_id"); - const deviceId = localStorage.getItem("mx_device_id"); - - let isGuest; - if (localStorage.getItem("mx_is_guest") !== null) { - isGuest = localStorage.getItem("mx_is_guest") === "true"; - } else { - // legacy key name - isGuest = localStorage.getItem("matrix-is-guest") === "true"; - } - - return { - hsUrl, - isUrl, - hasAccessToken, - accessToken, - userId, - deviceId, - isGuest, - }; -} - -// The pickle key is a string of unspecified length and format. For AES, we -// need a 256-bit Uint8Array. So we HKDF the pickle key to generate the AES -// key. The AES key should be zeroed after it is used. -async function pickleKeyToAesKey(pickleKey: string): Promise { - const pickleKeyBuffer = new Uint8Array(pickleKey.length); - for (let i = 0; i < pickleKey.length; i++) { - pickleKeyBuffer[i] = pickleKey.charCodeAt(i); - } - const hkdfKey = await window.crypto.subtle.importKey( - "raw", - pickleKeyBuffer, - "HKDF", - false, - ["deriveBits"] - ); - pickleKeyBuffer.fill(0); - return new Uint8Array( - await window.crypto.subtle.deriveBits( - { - name: "HKDF", - hash: "SHA-256", - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore: https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/879 - salt: new Uint8Array(32), - info: new Uint8Array(0), - }, - hkdfKey, - 256 - ) - ); -} - -async function abortLogin() { - const signOut = await showStorageEvictedDialog(); - if (signOut) { - await clearStorage(); - // This error feels a bit clunky, but we want to make sure we don't go any - // further and instead head back to sign in. - throw new AbortLoginAndRebuildStorage( - "Aborting login in progress because of storage inconsistency" - ); - } -} - -// returns a promise which resolves to true if a session is found in -// localstorage -// -// N.B. Lifecycle.js should not maintain any further localStorage state, we -// are moving towards using SessionStore to keep track of state related -// to the current session (which is typically backed by localStorage). -// -// The plan is to gradually move the localStorage access done here into -// SessionStore to avoid bugs where the view becomes out-of-sync with -// localStorage (e.g. isGuest etc.) -export async function restoreFromLocalStorage(opts?: { - ignoreGuest?: boolean; -}): Promise { - const ignoreGuest = opts?.ignoreGuest; - - if (!localStorage) { - return false; - } - - const { - hsUrl, - isUrl, - hasAccessToken, - accessToken, - userId, - deviceId, - isGuest, - } = await getStoredSessionVars(); - - if (hasAccessToken && !accessToken) { - abortLogin(); - } - - if (accessToken && userId && hsUrl) { - if (ignoreGuest && isGuest) { - console.log("Ignoring stored guest account: " + userId); - return false; - } - - let decryptedAccessToken = accessToken; - const pickleKey = await PlatformPeg.get().getPickleKey(userId, deviceId); - if (pickleKey) { - console.log("Got pickle key"); - if (typeof accessToken !== "string") { - const encrKey = await pickleKeyToAesKey(pickleKey); - decryptedAccessToken = await decryptAES( - accessToken, - encrKey, - "access_token" - ); - encrKey.fill(0); - } - } else { - console.log("No pickle key available"); - } - - const freshLogin = sessionStorage.getItem("mx_fresh_login") === "true"; - sessionStorage.removeItem("mx_fresh_login"); - - console.log(`Restoring session for ${userId}`); - await doSetLoggedIn( - { - userId: userId, - deviceId: deviceId, - accessToken: decryptedAccessToken as string, - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - guest: isGuest, - pickleKey: pickleKey, - freshLogin: freshLogin, - }, - false - ); - return true; - } else { - console.log("No previous session found."); - return false; - } -} - -async function handleLoadSessionFailure(e: Error): Promise { - console.error("Unable to load session", e); - - const SessionRestoreErrorDialog = sdk.getComponent( - "views.dialogs.SessionRestoreErrorDialog" - ); - - const modal = Modal.createTrackedDialog( - "Session Restore Error", - "", - SessionRestoreErrorDialog, - { - error: e.message, - } - ); - - const [success] = await modal.finished; - if (success) { - // user clicked continue. - await clearStorage(); - return false; - } - - // try, try again - return loadSession(); -} - -/** - * Transitions to a logged-in state using the given credentials. - * - * Starts the matrix client and all other react-sdk services that - * listen for events while a session is logged in. - * - * Also stops the old MatrixClient and clears old credentials/etc out of - * storage before starting the new client. - * - * @param {MatrixClientCreds} credentials The credentials to use - * - * @returns {Promise} promise which resolves to the new MatrixClient once it has been started - */ -export async function setLoggedIn( - credentials: IMatrixClientCreds -): Promise { - credentials.freshLogin = true; - stopMatrixClient(); - const pickleKey = - credentials.userId && credentials.deviceId - ? await PlatformPeg.get().createPickleKey( - credentials.userId, - credentials.deviceId - ) - : null; - - if (pickleKey) { - console.log("Created pickle key"); - } else { - console.log("Pickle key not created"); - } - - return doSetLoggedIn(Object.assign({}, credentials, { pickleKey }), true); -} - -/** - * Hydrates an existing session by using the credentials provided. This will - * not clear any local storage, unlike setLoggedIn(). - * - * Stops the existing Matrix client (without clearing its data) and starts a - * new one in its place. This additionally starts all other react-sdk services - * which use the new Matrix client. - * - * If the credentials belong to a different user from the session already stored, - * the old session will be cleared automatically. - * - * @param {MatrixClientCreds} credentials The credentials to use - * - * @returns {Promise} promise which resolves to the new MatrixClient once it has been started - */ -export function hydrateSession( - credentials: IMatrixClientCreds -): Promise { - const oldUserId = MatrixClientPeg.get().getUserId(); - const oldDeviceId = MatrixClientPeg.get().getDeviceId(); - - stopMatrixClient(); // unsets MatrixClientPeg.get() - localStorage.removeItem("mx_soft_logout"); - _isLoggingOut = false; - - const overwrite = - credentials.userId !== oldUserId || credentials.deviceId !== oldDeviceId; - if (overwrite) { - console.warn( - "Clearing all data: Old session belongs to a different user/session" - ); - } - - return doSetLoggedIn(credentials, overwrite); -} - -/** - * fires on_logging_in, optionally clears localstorage, persists new credentials - * to localstorage, starts the new client. - * - * @param {MatrixClientCreds} credentials - * @param {Boolean} clearStorage - * - * @returns {Promise} promise which resolves to the new MatrixClient once it has been started - */ -async function doSetLoggedIn( - credentials: IMatrixClientCreds, - clearStorageEnabled: boolean -): Promise { - credentials.guest = Boolean(credentials.guest); - - const softLogout = isSoftLogout(); - - console.log( - "setLoggedIn: mxid: " + - credentials.userId + - " deviceId: " + - credentials.deviceId + - " guest: " + - credentials.guest + - " hs: " + - credentials.homeserverUrl + - " softLogout: " + - softLogout, - " freshLogin: " + credentials.freshLogin - ); - - // This is dispatched to indicate that the user is still in the process of logging in - // because async code may take some time to resolve, breaking the assumption that - // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms - // later than MatrixChat might assume. - // - // we fire it *synchronously* to make sure it fires before on_logged_in. - // (dis.dispatch uses `setTimeout`, which does not guarantee ordering.) - dis.dispatch({ action: "on_logging_in" }, true); - - if (clearStorageEnabled) { - await clearStorage(); - } - - const results = await StorageManager.checkConsistency(); - // If there's an inconsistency between account data in local storage and the - // crypto store, we'll be generally confused when handling encrypted data. - // Show a modal recommending a full reset of storage. - if ( - results.dataInLocalStorage && - results.cryptoInited && - !results.dataInCryptoStore - ) { - await abortLogin(); - } - - Analytics.setLoggedIn(credentials.guest, credentials.homeserverUrl); - - MatrixClientPeg.replaceUsingCreds(credentials); - const client = MatrixClientPeg.get(); - - if (credentials.freshLogin && SettingsStore.getValue("feature_dehydration")) { - // If we just logged in, try to rehydrate a device instead of using a - // new device. If it succeeds, we'll get a new device ID, so make sure - // we persist that ID to localStorage - const newDeviceId = await client.rehydrateDevice(); - if (newDeviceId) { - credentials.deviceId = newDeviceId; - } - - delete credentials.freshLogin; - } - - if (localStorage) { - try { - await persistCredentials(credentials); - // make sure we don't think that it's a fresh login any more - sessionStorage.removeItem("mx_fresh_login"); - } catch (e) { - console.warn("Error using local storage: can't persist session!", e); - } - } else { - console.warn("No local storage available: can't persist session!"); - } - - dis.dispatch({ action: "on_logged_in" }); - - await startMatrixClient(/*startSyncing=*/ !softLogout); - return client; -} - -function showStorageEvictedDialog(): Promise { - const StorageEvictedDialog = sdk.getComponent( - "views.dialogs.StorageEvictedDialog" - ); - return new Promise((resolve) => { - Modal.createTrackedDialog("Storage evicted", "", StorageEvictedDialog, { - onFinished: resolve, - }); - }); -} - -// Note: Babel 6 requires the `transform-builtin-extend` plugin for this to satisfy -// `instanceof`. Babel 7 supports this natively in their class handling. -class AbortLoginAndRebuildStorage extends Error {} - -async function persistCredentials( - credentials: IMatrixClientCreds -): Promise { - localStorage.setItem(HOMESERVER_URL_KEY, credentials.homeserverUrl); - if (credentials.identityServerUrl) { - localStorage.setItem(ID_SERVER_URL_KEY, credentials.identityServerUrl); - } - localStorage.setItem("mx_user_id", credentials.userId); - localStorage.setItem("mx_is_guest", JSON.stringify(credentials.guest)); - - // store whether we expect to find an access token, to detect the case - // where IndexedDB is blown away - if (credentials.accessToken) { - localStorage.setItem("mx_has_access_token", "true"); - } else { - localStorage.deleteItem("mx_has_access_token"); - } - - if (credentials.pickleKey) { - let encryptedAccessToken; - try { - // try to encrypt the access token using the pickle key - const encrKey = await pickleKeyToAesKey(credentials.pickleKey); - encryptedAccessToken = await encryptAES( - credentials.accessToken, - encrKey, - "access_token" - ); - encrKey.fill(0); - } catch (e) { - console.warn("Could not encrypt access token", e); - } - try { - // save either the encrypted access token, or the plain access - // token if we were unable to encrypt (e.g. if the browser doesn't - // have WebCrypto). - await StorageManager.idbSave( - "account", - "mx_access_token", - encryptedAccessToken || credentials.accessToken - ); - } catch (e) { - // if we couldn't save to indexedDB, fall back to localStorage. We - // store the access token unencrypted since localStorage only saves - // strings. - localStorage.setItem("mx_access_token", credentials.accessToken); - } - localStorage.setItem("mx_has_pickle_key", String(true)); - } else { - try { - await StorageManager.idbSave( - "account", - "mx_access_token", - credentials.accessToken - ); - } catch (e) { - localStorage.setItem("mx_access_token", credentials.accessToken); - } - if (localStorage.getItem("mx_has_pickle_key")) { - console.error( - "Expected a pickle key, but none provided. Encryption may not work." - ); - } - } - - // if we didn't get a deviceId from the login, leave mx_device_id unset, - // rather than setting it to "undefined". - // - // (in this case MatrixClient doesn't bother with the crypto stuff - // - that's fine for us). - if (credentials.deviceId) { - localStorage.setItem("mx_device_id", credentials.deviceId); - } - - // SecurityCustomisations.persistCredentials?.(credentials); - - console.log(`Session persisted for ${credentials.userId}`); -} - -let _isLoggingOut = false; - -/** - * Logs the current session out and transitions to the logged-out state - */ -export function logout(): void { - if (!MatrixClientPeg.get()) return; - if (!CountlyAnalytics.instance.disabled) { - // user has logged out, fall back to anonymous - // CountlyAnalytics.instance.enable(/* anonymous = */ true); - } - - if (MatrixClientPeg.get().isGuest()) { - // logout doesn't work for guest sessions - // Also we sometimes want to re-log in a guest session if we abort the login. - // defer until next tick because it calls a synchronous dispatch and we are likely here from a dispatch. - setImmediate(() => onLoggedOut()); - return; - } - - _isLoggingOut = true; - const client = MatrixClientPeg.get(); - PlatformPeg.get().destroyPickleKey(client.getUserId(), client.getDeviceId()); - client.logout().then(onLoggedOut, (err) => { - // Just throwing an error here is going to be very unhelpful - // if you're trying to log out because your server's down and - // you want to log into a different server, so just forget the - // access token. It's annoying that this will leave the access - // token still valid, but we should fix this by having access - // tokens expire (and if you really think you've been compromised, - // change your password). - console.log("Failed to call logout API: token will not be invalidated"); - onLoggedOut(); - }); -} - -export function softLogout(): void { - if (!MatrixClientPeg.get()) return; - - // Track that we've detected and trapped a soft logout. This helps prevent other - // parts of the app from starting if there's no point (ie: don't sync if we've - // been soft logged out, despite having credentials and data for a MatrixClient). - localStorage.setItem("mx_soft_logout", "true"); - - // Dev note: please keep this log line around. It can be useful for track down - // random clients stopping in the middle of the logs. - console.log("Soft logout initiated"); - _isLoggingOut = true; // to avoid repeated flags - // Ensure that we dispatch a view change **before** stopping the client so - // so that React components unmount first. This avoids React soft crashes - // that can occur when components try to use a null client. - dis.dispatch({ action: "on_client_not_viable" }); // generic version of on_logged_out - stopMatrixClient(/*unsetClient=*/ false); - - // DO NOT CALL LOGOUT. A soft logout preserves data, logout does not. -} - -export function isSoftLogout(): boolean { - return localStorage.getItem("mx_soft_logout") === "true"; -} - -export function isLoggingOut(): boolean { - return _isLoggingOut; -} - -/** - * Starts the matrix client and all other react-sdk services that - * listen for events while a session is logged in. - * @param {boolean} startSyncing True (default) to actually start - * syncing the client. - */ -async function startMatrixClient(startSyncing = true): Promise { - console.log(`Lifecycle: Starting MatrixClient`); - - // dispatch this before starting the matrix client: it's used - // to add listeners for the 'sync' event so otherwise we'd have - // a race condition (and we need to dispatch synchronously for this - // to work). - dis.dispatch({ action: "will_start_client" }, true); - - // reset things first just in case - TypingStore.sharedInstance().reset(); - ToastStore.sharedInstance().reset(); - - Notifier.start(); - UserActivity.sharedInstance().start(); - DMRoomMap.makeShared().start(); - IntegrationManagers.sharedInstance().startWatching(); - ActiveWidgetStore.start(); - CallHandler.sharedInstance().start(); - - // Start Mjolnir even though we haven't checked the feature flag yet. Starting - // the thing just wastes CPU cycles, but should result in no actual functionality - // being exposed to the user. - Mjolnir.sharedInstance().start(); - - if (startSyncing) { - // The client might want to populate some views with events from the - // index (e.g. the FilePanel), therefore initialize the event index - // before the client. - await EventIndexPeg.init(); - await MatrixClientPeg.start(); - } else { - console.warn("Caller requested only auxiliary services be started"); - await MatrixClientPeg.assign(); - } - - // This needs to be started after crypto is set up - DeviceListener.sharedInstance().start(); - // Similarly, don't start sending presence updates until we've started - // the client - if (!SettingsStore.getValue("lowBandwidth")) { - Presence.start(); - } - - // Now that we have a MatrixClientPeg, update the Jitsi info - await Jitsi.getInstance().start(); - - // dispatch that we finished starting up to wire up any other bits - // of the matrix client that cannot be set prior to starting up. - // dis.dispatch({ action: "client_started" }); - this.onClientStarted(); - - if (isSoftLogout()) { - softLogout(); - } -} - -/* - * Stops a running client and all related services, and clears persistent - * storage. Used after a session has been logged out. - */ -export async function onLoggedOut(): Promise { - _isLoggingOut = false; - // Ensure that we dispatch a view change **before** stopping the client so - // so that React components unmount first. This avoids React soft crashes - // that can occur when components try to use a null client. - dis.dispatch({ action: "on_logged_out" }, true); - stopMatrixClient(); - await clearStorage({ deleteEverything: true }); - LifecycleCustomisations.onLoggedOutAndStorageCleared?.(); -} - -/** - * @param {object} opts Options for how to clear storage. - * @returns {Promise} promise which resolves once the stores have been cleared - */ -async function clearStorage(opts?: { - deleteEverything?: boolean; -}): Promise { - Analytics.disable(); - - if (window.localStorage) { - // try to save any 3pid invites from being obliterated - const pendingInvites = ThreepidInviteStore.instance.getWireInvites(); - - window.localStorage.clear(); - - try { - await StorageManager.idbDelete("account", "mx_access_token"); - } catch (e) {} - - // now restore those invites - if (!opts?.deleteEverything) { - pendingInvites.forEach((i) => { - const roomId = i.roomId; - delete i.roomId; // delete to avoid confusing the store - ThreepidInviteStore.instance.storeInvite(roomId, i); - }); - } - } - - if (window.sessionStorage) { - window.sessionStorage.clear(); - } - - // create a temporary client to clear out the persistent stores. - const cli = createMatrixClient({ - // we'll never make any requests, so can pass a bogus HS URL - baseUrl: "", - }); - - await EventIndexPeg.deleteEventIndex(); - await cli.clearStores(); -} - -/** - * Stop all the background processes related to the current client. - * @param {boolean} unsetClient True (default) to abandon the client - * on MatrixClientPeg after stopping. - */ -export function stopMatrixClient(unsetClient = true): void { - Notifier.stop(); - CallHandler.sharedInstance().stop(); - UserActivity.sharedInstance().stop(); - TypingStore.sharedInstance().reset(); - Presence.stop(); - ActiveWidgetStore.stop(); - IntegrationManagers.sharedInstance().stopWatching(); - Mjolnir.sharedInstance().stop(); - DeviceListener.sharedInstance().stop(); - if (DMRoomMap.shared()) DMRoomMap.shared().stop(); - EventIndexPeg.stop(); - const cli = MatrixClientPeg.get(); - if (cli) { - cli.stopClient(); - cli.removeAllListeners(); - - if (unsetClient) { - MatrixClientPeg.unset(); - EventIndexPeg.unset(); - } - } -} diff --git a/packages/editor/src/app/matrix-auth/MatrixAuthStore.ts b/packages/editor/src/app/matrix-auth/MatrixAuthStore.ts deleted file mode 100644 index f7f1c5e44..000000000 --- a/packages/editor/src/app/matrix-auth/MatrixAuthStore.ts +++ /dev/null @@ -1,1102 +0,0 @@ -import { createClient, MatrixClient } from "matrix-js-sdk"; -import { event, lifecycle } from "vscode-lib"; -import { MATRIX_CONFIG } from "../../config/config"; -import { sendLoginRequest } from "./auth/LoginHelper"; -import { IMatrixClientCreds } from "./auth/util/matrix"; -import { - abortLogin, - clearStorage, - createPickleKey, - getPickleKey, - getStoredSessionVars, - isSoftLogout, - persistCredentials, - pickleKeyToAesKey, - SSO_HOMESERVER_URL_KEY, - SSO_ID_SERVER_URL_KEY, -} from "./AuthStoreUtil"; -import { MatrixClientPeg } from "./MatrixClientPeg"; -import * as StorageManager from "./StorageManager"; -import { decryptAES } from "./unexported/aes"; -import { decodeParams } from "./utils"; - -interface ILoadSessionOpts { - enableGuest?: boolean; - guestHsUrl?: string; - guestIsUrl?: string; - ignoreGuest?: boolean; - defaultDeviceDisplayName?: string; - fragmentQueryParams?: Record; -} - -export interface IStoredSession { - hsUrl: string; - isUrl: string; - hasAccessToken: boolean; - accessToken: string | object; - userId: string; - deviceId: string; - isGuest: boolean; -} - -export class MatrixAuthStore extends lifecycle.Disposable { - private accountPassword: string | undefined; - private accountPasswordTimer: ReturnType | undefined; - private firstSyncPromise: Promise | undefined; - private firstSyncComplete: boolean = false; - private _isLoggingOut = false; - private _loggedIn = false; - - public get loggedIn() { - return this._loggedIn; - } - - public pendingInitialSyncAndKeySync = true; - - public needsCompleteSecurity = false; - public needsE2ESetup = false; - - private readonly _onLoggedInChanged: event.Emitter = this._register( - new event.Emitter() - ); - - public readonly onLoggedInChanged: event.Event = - this._onLoggedInChanged.event; - - // based on https://github.com/matrix-org/matrix-react-sdk/blob/96e16940bb9d30fbbbb1133fae796c1021e871f3/src/components/structures/MatrixChat.tsx#L350 - public async initialize(enableGuest: boolean) { - const params = decodeParams(window.location.search.substring(1)); - const loggedIn = await this.attemptTokenLogin( - params as any, - MATRIX_CONFIG.defaultDeviceDisplayName, - "/" - ); - - const url = new URL(window.location.href); - if (url.searchParams.has("loginToken")) { - url.searchParams.delete("loginToken"); - window.history.replaceState(null, "", url.href); - } - - if (loggedIn) { - // this.tokenLogin = true; - - // Create and start the client - await this.restoreFromLocalStorage({ - ignoreGuest: true, - }); - await this.postLoginSetup(); - return true; - } else { - return await this.loadSession({ - enableGuest, - defaultDeviceDisplayName: MATRIX_CONFIG.defaultDeviceDisplayName, - guestHsUrl: MATRIX_CONFIG.hsUrl, - guestIsUrl: MATRIX_CONFIG.isUrl, - }); - } - } - - private setLoggedInState(value: boolean) { - if (this._loggedIn !== value) { - this._loggedIn = value; - this._onLoggedInChanged.fire(this._loggedIn); - } - } - - /** - * fires on_logging_in, optionally clears localstorage, persists new credentials - * to localstorage, starts the new client. - * - * @param {MatrixClientCreds} credentials - * @param {Boolean} clearStorage - * - * @returns {Promise} promise which resolves to the new MatrixClient once it has been started - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L541 - */ - private async doSetLoggedIn( - credentials: IMatrixClientCreds, - clearStorageEnabled: boolean - ): Promise { - credentials.guest = Boolean(credentials.guest); - - const softLogout = isSoftLogout(); - - console.log( - "setLoggedIn: mxid: " + - credentials.userId + - " deviceId: " + - credentials.deviceId + - " guest: " + - credentials.guest + - " hs: " + - credentials.homeserverUrl + - " softLogout: " + - softLogout, - " freshLogin: " + credentials.freshLogin - ); - - // This is dispatched to indicate that the user is still in the process of logging in - // because async code may take some time to resolve, breaking the assumption that - // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms - // later than MatrixChat might assume. - // - // we fire it *synchronously* to make sure it fires before on_logged_in. - // (dis.dispatch uses `setTimeout`, which does not guarantee ordering.) - - // dis.dispatch({ action: "on_logging_in" }, true); - - if (clearStorageEnabled) { - await clearStorage(); - } - - const results = await StorageManager.checkConsistency(); - // If there's an inconsistency between account data in local storage and the - // crypto store, we'll be generally confused when handling encrypted data. - // Show a modal recommending a full reset of storage. - if ( - results.dataInLocalStorage && - results.cryptoInited && - !results.dataInCryptoStore - ) { - await abortLogin(); - } - - // Analytics.setLoggedIn(credentials.guest, credentials.homeserverUrl); - - MatrixClientPeg.replaceUsingCreds(credentials); - const client = MatrixClientPeg.get(); - - if ( - credentials.freshLogin && - false // SettingsStore.getValue("feature_dehydration") - ) { - // If we just logged in, try to rehydrate a device instead of using a - // new device. If it succeeds, we'll get a new device ID, so make sure - // we persist that ID to localStorage - const newDeviceId = await client.rehydrateDevice(); - if (newDeviceId) { - credentials.deviceId = newDeviceId; - } - - delete credentials.freshLogin; - } - - if (localStorage) { - try { - await persistCredentials(credentials); - // make sure we don't think that it's a fresh login any more - sessionStorage.removeItem("mx_fresh_login"); - } catch (e) { - console.warn("Error using local storage: can't persist session!", e); - } - } else { - console.warn("No local storage available: can't persist session!"); - } - - StorageManager.tryPersistStorage(); - // dis.dispatch({ action: "on_logged_in" }); - - await this.startMatrixClient(/*startSyncing=*/ !softLogout); - this.setLoggedInState(true); // originally this would be above startMatrixClient - return client; - } - - /** - * Transitions to a logged-in state using the given credentials. - * - * Starts the matrix client and all other react-sdk services that - * listen for events while a session is logged in. - * - * Also stops the old MatrixClient and clears old credentials/etc out of - * storage before starting the new client. - * - * @param {MatrixClientCreds} credentials The credentials to use - * - * @returns {Promise} promise which resolves to the new MatrixClient once it has been started - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/Lifecycle.ts - */ - private async setLoggedIn( - credentials: IMatrixClientCreds - ): Promise { - this.setLoggedInState(false); - credentials.freshLogin = true; - this.stopMatrixClient(); - const pickleKey = - credentials.userId && credentials.deviceId - ? await createPickleKey(credentials.userId, credentials.deviceId) - : null; - - if (pickleKey) { - console.log("Created pickle key"); - } else { - console.log("Pickle key not created"); - } - - return this.doSetLoggedIn( - Object.assign({}, credentials, { pickleKey }), - true - ); - } - - /** - * After registration or login, we run various post-auth steps before entering the app - * proper, such setting up cross-signing or verifying the new session. - * - * Note: SSO users (and any others using token login) currently do not pass through - * this, as they instead jump straight into the app after `attemptTokenLogin`. - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/components/structures/MatrixChat.tsx#L1940 - */ - onUserCompletedLoginFlow = async ( - credentials: IMatrixClientCreds, - password: string - ) => { - this.accountPassword = password; - // self-destruct the password after 5mins - if (this.accountPasswordTimer) { - clearTimeout(this.accountPasswordTimer); - } - this.accountPasswordTimer = setTimeout(() => { - this.accountPassword = undefined; - this.accountPasswordTimer = undefined; - }, 60 * 5 * 1000); - - // Create and start the client - await this.setLoggedIn(credentials); - await this.postLoginSetup(); - // PerformanceMonitor.instance.stop(PerformanceEntryNames.LOGIN); - // PerformanceMonitor.instance.stop(PerformanceEntryNames.REGISTER); - }; - - /** - * Called just before the matrix client is started - * (useful for setting listeners) - */ - private onWillStartClient() { - // reset the 'have completed first sync' flag, - // since we're about to start the client and therefore about - // to do the first sync - this.pendingInitialSyncAndKeySync = true; - this.firstSyncComplete = false; - let resolveFirstSyncPromise: () => void; - this.firstSyncPromise = new Promise((r) => (resolveFirstSyncPromise = r)); - const cli = MatrixClientPeg.get(); - - // Allow the JS SDK to reap timeline events. This reduces the amount of - // memory consumed as the JS SDK stores multiple distinct copies of room - // state (each of which can be 10s of MBs) for each DISJOINT timeline. This is - // particularly noticeable when there are lots of 'limited' /sync responses - // such as when laptops unsleep. - // https://github.com/vector-im/element-web/issues/3307#issuecomment-282895568 - cli.setCanResetTimelineCallback((roomId: string) => { - return true; - // console.log( - // "Request to reset timeline in room ", - // roomId, - // " viewing:", - // this.state.currentRoomId - // ); - // if (roomId !== this.state.currentRoomId) { - // // It is safe to remove events from rooms we are not viewing. - // return true; - // } - // // We are viewing the room which we want to reset. It is only safe to do - // // this if we are not scrolled up in the view. To find out, delegate to - // // the timeline panel. If the timeline panel doesn't exist, then we assume - // // it is safe to reset the timeline. - // if (!this.loggedInView.current) { - // return true; - // } - // return this.loggedInView.current.canResetTimelineInRoom(roomId); - }); - - cli.on("sync", (state: any, prevState: any, data: any) => { - // LifecycleStore and others cannot directly subscribe to matrix client for - // events because flux only allows store state changes during flux dispatches. - // So dispatch directly from here. Ideally we'd use a SyncStateStore that - // would do this dispatch and expose the sync state itself (by listening to - // its own dispatch). - // dis.dispatch({ action: "sync_state", prevState, state }); - - // if (state === "ERROR" || state === "RECONNECTING") { - // if (data.error instanceof InvalidStoreError) { - // Lifecycle.handleInvalidStoreError(data.error); - // } - // this.setState({ syncError: data.error || true }); - // } else if (this.state.syncError) { - // this.setState({ syncError: null }); - // } - - // this.updateStatusIndicator(state, prevState); - // if (state === "SYNCING" && prevState === "SYNCING") { - // return; - // } - // console.info("MatrixClient sync state => %s", state); - // if (state !== "PREPARED") { - // return; - // } - - this.firstSyncComplete = true; - resolveFirstSyncPromise(); - - // if ( - // Notifier.shouldShowPrompt() && - // !MatrixClientPeg.userRegisteredWithinLastHours(24) - // ) { - // showNotificationsToast(false); - // } - - // dis.fire(Action.FocusComposer); - // this.setState({ - // ready: true, - // }); - }); - - cli.on("Session.logged_out", (errObj: any) => { - console.log("Session.logged_out"); - this.setLoggedInState(false); - - if (this._isLoggingOut) return; - - // A modal might have been open when we were logged out by the server - // Modal.closeCurrentModal("Session.logged_out"); - - if ( - errObj.httpStatus === 401 && - errObj.data && - errObj.data["soft_logout"] - ) { - console.warn("Soft logout issued by server - avoiding data deletion"); - this.softLogout(); - return; - } - - // Modal.createTrackedDialog("Signed out", "", ErrorDialog, { - // title: _t("Signed Out"), - // description: _t( - // "For security, this session has been signed out. Please sign in again." - // ), - // }); - - // dis.dispatch({ - // action: "logout", - // }); - }); - // cli.on("no_consent", function (message, consentUri) { - // const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - // Modal.createTrackedDialog( - // "No Consent Dialog", - // "", - // QuestionDialog, - // { - // title: _t("Terms and Conditions"), - // description: ( - //
- //

- // {" "} - // {_t( - // "To continue using the %(homeserverDomain)s homeserver " + - // "you must review and agree to our terms and conditions.", - // { homeserverDomain: cli.getDomain() } - // )} - //

- //
- // ), - // button: _t("Review terms and conditions"), - // cancelButton: _t("Dismiss"), - // onFinished: (confirmed) => { - // if (confirmed) { - // const wnd = window.open(consentUri, "_blank"); - // wnd.opener = null; - // } - // }, - // }, - // null, - // true - // ); - // }); - - // const dft = new DecryptionFailureTracker( - // (total, errorCode) => { - // Analytics.trackEvent("E2E", "Decryption failure", errorCode, total); - // CountlyAnalytics.instance.track( - // "decryption_failure", - // { errorCode }, - // null, - // { sum: total } - // ); - // }, - // (errorCode) => { - // // Map JS-SDK error codes to tracker codes for aggregation - // switch (errorCode) { - // case "MEGOLM_UNKNOWN_INBOUND_SESSION_ID": - // return "olm_keys_not_sent_error"; - // case "OLM_UNKNOWN_MESSAGE_INDEX": - // return "olm_index_error"; - // case undefined: - // return "unexpected_error"; - // default: - // return "unspecified_error"; - // } - // } - // ); - - // Shelved for later date when we have time to think about persisting history of - // tracked events across sessions. - // dft.loadTrackedEventHashMap(); - - // dft.start(); - - // When logging out, stop tracking failures and destroy state - // cli.on("Session.logged_out", () => dft.stop()); - // cli.on("Event.decrypted", (e, err) => dft.eventDecrypted(e, err)); - - // cli.on("Room", (room) => { - // if (MatrixClientPeg.get().isCryptoEnabled()) { - // const blacklistEnabled = SettingsStore.getValueAt( - // SettingLevel.ROOM_DEVICE, - // "blacklistUnverifiedDevices", - // room.roomId, - // /*explicit=*/ true - // ); - // room.setBlacklistUnverifiedDevices(blacklistEnabled); - // } - // }); - // cli.on("crypto.warning", (type) => { - // switch (type) { - // case "CRYPTO_WARNING_OLD_VERSION_DETECTED": - // Modal.createTrackedDialog("Crypto migrated", "", ErrorDialog, { - // title: _t("Old cryptography data detected"), - // description: _t( - // "Data from an older version of %(brand)s has been detected. " + - // "This will have caused end-to-end cryptography to malfunction " + - // "in the older version. End-to-end encrypted messages exchanged " + - // "recently whilst using the older version may not be decryptable " + - // "in this version. This may also cause messages exchanged with this " + - // "version to fail. If you experience problems, log out and back in " + - // "again. To retain message history, export and re-import your keys.", - // { brand: SdkConfig.get().brand } - // ), - // }); - // break; - // } - // }); - // cli.on("crypto.keyBackupFailed", async (errcode) => { - // let haveNewVersion; - // let newVersionInfo; - // // if key backup is still enabled, there must be a new backup in place - // if (MatrixClientPeg.get().getKeyBackupEnabled()) { - // haveNewVersion = true; - // } else { - // // otherwise check the server to see if there's a new one - // try { - // newVersionInfo = await MatrixClientPeg.get().getKeyBackupVersion(); - // if (newVersionInfo !== null) haveNewVersion = true; - // } catch (e) { - // console.error( - // "Saw key backup error but failed to check backup version!", - // e - // ); - // return; - // } - // } - - // if (haveNewVersion) { - // Modal.createTrackedDialogAsync( - // "New Recovery Method", - // "New Recovery Method", - // import( - // "../../async-components/views/dialogs/security/NewRecoveryMethodDialog" - // ), - // { newVersionInfo } - // ); - // } else { - // Modal.createTrackedDialogAsync( - // "Recovery Method Removed", - // "Recovery Method Removed", - // import( - // "../../async-components/views/dialogs/security/RecoveryMethodRemovedDialog" - // ) - // ); - // } - // }); - - // cli.on( - // "crypto.keySignatureUploadFailure", - // (failures, source, continuation) => { - // const KeySignatureUploadFailedDialog = sdk.getComponent( - // "views.dialogs.KeySignatureUploadFailedDialog" - // ); - // Modal.createTrackedDialog( - // "Failed to upload key signatures", - // "Failed to upload key signatures", - // KeySignatureUploadFailedDialog, - // { failures, source, continuation } - // ); - // } - // ); - - // cli.on("crypto.verification.request", (request) => { - // if (request.verifier) { - // const IncomingSasDialog = sdk.getComponent( - // "views.dialogs.IncomingSasDialog" - // ); - // Modal.createTrackedDialog( - // "Incoming Verification", - // "", - // IncomingSasDialog, - // { - // verifier: request.verifier, - // }, - // null, - // /* priority = */ false, - // /* static = */ true - // ); - // } else if (request.pending) { - // ToastStore.sharedInstance().addOrReplaceToast({ - // key: "verifreq_" + request.channel.transactionId, - // title: _t("Verification requested"), - // icon: "verification", - // props: { request }, - // component: sdk.getComponent("toasts.VerificationRequestToast"), - // priority: 90, - // }); - // } - // }); - } - - /** - * Starts the matrix client and all other react-sdk services that - * listen for events while a session is logged in. - * @param {boolean} startSyncing True (default) to actually start - * syncing the client. - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L768 - */ - private async startMatrixClient(startSyncing = true): Promise { - console.log(`Lifecycle: Starting MatrixClient`); - - // dispatch this before starting the matrix client: it's used - // to add listeners for the 'sync' event so otherwise we'd have - // a race condition (and we need to dispatch synchronously for this - // to work). - // dis.dispatch({ action: "will_start_client" }, true); - - this.onWillStartClient(); - // reset things first just in case - // TypingStore.sharedInstance().reset(); - // ToastStore.sharedInstance().reset(); - - // Notifier.start(); - // UserActivity.sharedInstance().start(); - // DMRoomMap.makeShared().start(); - // IntegrationManagers.sharedInstance().startWatching(); - // ActiveWidgetStore.start(); - // CallHandler.sharedInstance().start(); - - // Start Mjolnir even though we haven't checked the feature flag yet. Starting - // the thing just wastes CPU cycles, but should result in no actual functionality - // being exposed to the user. - // Mjolnir.sharedInstance().start(); - - if (startSyncing) { - // The client might want to populate some views with events from the - // index (e.g. the FilePanel), therefore initialize the event index - // before the client. - // await EventIndexPeg.init(); - // start client for e2ee support - // await MatrixClientPeg.start(); - } else { - // console.warn("Caller requested only auxiliary services be started"); - //await MatrixClientPeg.assign(); - } - - // This needs to be started after crypto is set up - // DeviceListener.sharedInstance().start(); TODO - // Similarly, don't start sending presence updates until we've started - // the client - // if (!SettingsStore.getValue("lowBandwidth")) { - // Presence.start(); - // } - - // Now that we have a MatrixClientPeg, update the Jitsi info - // await Jitsi.getInstance().start(); - - // dispatch that we finished starting up to wire up any other bits - // of the matrix client that cannot be set prior to starting up. - // dis.dispatch({action: 'client_started'}); - - await MatrixClientPeg.get().initCrypto(); - try { - await MatrixClientPeg.get().crypto.uploadDeviceKeys(); - } catch (e) { - console.error("upload device keys failed", e); - } - MatrixClientPeg.get().crypto.start(); - - this.onClientStarted(); - - if (isSoftLogout()) { - this.softLogout(); - } - } - - /** - * Called at startup, to attempt to build a logged-in Matrix session. It tries - * a number of things: - * - * 1. if we have a guest access token in the fragment query params, it uses - * that. - * 2. if an access token is stored in local storage (from a previous session), - * it uses that. - * 3. it attempts to auto-register as a guest user. - * - * If any of steps 1-4 are successful, it will call {_doSetLoggedIn}, which in - * turn will raise on_logged_in and will_start_client events. - * - * @param {object} [opts] - * @param {object} [opts.fragmentQueryParams]: string->string map of the - * query-parameters extracted from the #-fragment of the starting URI. - * @param {boolean} [opts.enableGuest]: set to true to enable guest access - * tokens and auto-guest registrations. - * @param {string} [opts.guestHsUrl]: homeserver URL. Only used if enableGuest - * is true; defines the HS to register against. - * @param {string} [opts.guestIsUrl]: homeserver URL. Only used if enableGuest - * is true; defines the IS to use. - * @param {bool} [opts.ignoreGuest]: If the stored session is a guest account, - * ignore it and don't load it. - * @param {string} [opts.defaultDeviceDisplayName]: Default display name to use - * when registering as a guest. - * @returns {Promise} a promise which resolves when the above process completes. - * Resolves to `true` if we ended up starting a session, or `false` if we - * failed. - */ - public async loadSession(opts: ILoadSessionOpts = {}): Promise { - try { - let enableGuest = opts.enableGuest || false; - const guestHsUrl = opts.guestHsUrl; - const guestIsUrl = opts.guestIsUrl; - const fragmentQueryParams = opts.fragmentQueryParams || {}; - // const defaultDeviceDisplayName = opts.defaultDeviceDisplayName; - - if (enableGuest && !guestHsUrl) { - console.warn( - "Cannot enable guest access: can't determine HS URL to use" - ); - enableGuest = false; - } - - if ( - enableGuest && - fragmentQueryParams.guest_user_id && - fragmentQueryParams.guest_access_token - ) { - console.log("Using guest access credentials"); - return this.doSetLoggedIn( - { - userId: fragmentQueryParams.guest_user_id, - accessToken: fragmentQueryParams.guest_access_token, - homeserverUrl: guestHsUrl!, - identityServerUrl: guestIsUrl!, - guest: true, - }, - true - ).then(() => true); - } - const success = await this.restoreFromLocalStorage({ - ignoreGuest: Boolean(opts.ignoreGuest), - }); - if (success) { - return true; - } - - if (enableGuest) { - if (!guestHsUrl || !opts.defaultDeviceDisplayName) { - throw new Error("enable guest with invalid params"); - } - return this.registerAsGuest( - guestHsUrl, - guestIsUrl, - opts.defaultDeviceDisplayName - ); - } - - // fall back to welcome screen - return false; - } catch (e) { - throw e; - // if (e instanceof AbortLoginAndRebuildStorage) { - // // If we're aborting login because of a storage inconsistency, we don't - // // need to show the general failure dialog. Instead, just go back to welcome. - // return false; - // } - // return handleLoadSessionFailure(e); - } - } - - private async registerAsGuest( - hsUrl: string, - isUrl: string | undefined, - defaultDeviceDisplayName: string - ): Promise { - console.log(`Doing guest login on ${hsUrl}`); - - // create a temporary MatrixClient to do the login - const client = createClient({ - baseUrl: hsUrl, - }); - - try { - const creds = await client.registerGuest({ - body: { - initial_device_display_name: defaultDeviceDisplayName, - }, - }); - - console.log(`Registered as guest: ${creds.user_id}`); - await this.doSetLoggedIn( - { - userId: creds.user_id, - deviceId: creds.device_id, - accessToken: creds.access_token, - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - guest: true, - }, - true - ); - return true; - } catch (err) { - console.error("Failed to register as guest", err); - return false; - } - } - /** - * @param {Object} queryParams string->string map of the - * query-parameters extracted from the real query-string of the starting - * URI. - * - * @param {string} defaultDeviceDisplayName - * @param {string} fragmentAfterLogin path to go to after a successful login, only used for "Try again" - * - * @returns {Promise} promise which resolves to true if we completed the token - * login, else false - */ - public async attemptTokenLogin( - queryParams: Record, - defaultDeviceDisplayName?: string, - fragmentAfterLogin?: string - ): Promise { - if (!queryParams.loginToken) { - return false; - } - - const homeserver = localStorage.getItem(SSO_HOMESERVER_URL_KEY); - const identityServer = - localStorage.getItem(SSO_ID_SERVER_URL_KEY) || undefined; - if (!homeserver) { - console.warn("Cannot log in with token: can't determine HS URL to use"); - throw new Error("unknown hs"); - } - - try { - const creds = await sendLoginRequest( - homeserver, - identityServer, - "m.login.token", - { - token: queryParams.loginToken, - initial_device_display_name: defaultDeviceDisplayName, - } - ); - - console.log("Logged in with token"); - await clearStorage(); - await persistCredentials(creds); - // remember that we just logged in - sessionStorage.setItem("mx_fresh_login", String(true)); - return true; - } catch (err) { - console.error("Failed to log in with login token:"); - console.error(err); - // return false; - throw err; - } - } - - // returns a promise which resolves to true if a session is found in - // localstorage - // - // N.B. Lifecycle.js should not maintain any further localStorage state, we - // are moving towards using SessionStore to keep track of state related - // to the current session (which is typically backed by localStorage). - // - // The plan is to gradually move the localStorage access done here into - // SessionStore to avoid bugs where the view becomes out-of-sync with - // localStorage (e.g. isGuest etc.) - private async restoreFromLocalStorage(opts?: { - ignoreGuest?: boolean; - }): Promise { - const ignoreGuest = opts?.ignoreGuest; - - if (!localStorage) { - return false; - } - - const { - hsUrl, - isUrl, - hasAccessToken, - accessToken, - userId, - deviceId, - isGuest, - } = await getStoredSessionVars(); - - if (hasAccessToken && !accessToken) { - abortLogin(); - } - - if (accessToken && userId && hsUrl) { - if (ignoreGuest && isGuest) { - console.log("Ignoring stored guest account: " + userId); - return false; - } - - let decryptedAccessToken = accessToken; - const pickleKey = await getPickleKey(userId, deviceId); - if (pickleKey) { - console.log("Got pickle key"); - if (typeof accessToken !== "string") { - const encrKey = await pickleKeyToAesKey(pickleKey); - decryptedAccessToken = await decryptAES( - accessToken, - encrKey, - "access_token" - ); - encrKey.fill(0); - } - } else { - console.log("No pickle key available"); - } - - const freshLogin = sessionStorage.getItem("mx_fresh_login") === "true"; - sessionStorage.removeItem("mx_fresh_login"); - - console.log(`Restoring session for ${userId}`); - await this.doSetLoggedIn( - { - userId: userId, - deviceId: deviceId, - accessToken: decryptedAccessToken as string, - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - guest: isGuest, - pickleKey: pickleKey, - freshLogin: freshLogin, - }, - false - ); - return true; - } else { - console.log("No previous session found."); - return false; - } - } - - /** - * Called shortly after the matrix client has started. Useful for - * setting up anything that requires the client to be started. - * @private - */ - private async onClientStarted() { - const cli = MatrixClientPeg.get(); - - if (cli.isCryptoEnabled()) { - // const blacklistEnabled = SettingsStore.getValueAt( - // SettingLevel.DEVICE, - // "blacklistUnverifiedDevices" - // ); - // cli.setGlobalBlacklistUnverifiedDevices(blacklistEnabled); - // With cross-signing enabled, we send to unknown devices - // without prompting. Any bad-device status the user should - // be aware of will be signalled through the room shield - // changing colour. More advanced behaviour will come once - // we implement more settings. - // TODO: determine if we want this when enabling e2ee - cli.setGlobalErrorOnUnknownDevices(false); - } - } - - // source: https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/components/structures/MatrixChat.tsx - public postLoginSetup = async () => { - const cli = MatrixClientPeg.get(); - const cryptoEnabled = cli.isCryptoEnabled(); - if (!cryptoEnabled) { - // this.onLoggedIn(); - StorageManager.tryPersistStorage(); - this.setLoggedInState(true); - } - - const promisesList = []; //[this.firstSyncPromise!]; - if (cryptoEnabled) { - // wait for the client to finish downloading cross-signing keys for us so we - // know whether or not we have keys set up on this account - promisesList.push(cli.downloadKeys([cli.getUserId()])); - } - - // Now update the state to say we're waiting for the first sync to complete rather - // than for the login to finish. - this.pendingInitialSyncAndKeySync = true; - - await Promise.all(promisesList); - - if (!cryptoEnabled) { - this.pendingInitialSyncAndKeySync = false; - return; - } - - const crossSigningIsSetUp = cli.getStoredCrossSigningForUser( - cli.getUserId() - ); - - if (crossSigningIsSetUp) { - // if (SecurityCustomisations.SHOW_ENCRYPTION_SETUP_UI === false) { - // this.onLoggedIn(); - // } else { - this.needsCompleteSecurity = true; - // this.setStateForNewView({ view: Views.COMPLETE_SECURITY }); - // } - } else if ( - await cli.doesServerSupportUnstableFeature("org.matrix.e2e_cross_signing") - ) { - this.needsE2ESetup = true; - // this.setStateForNewView({ view: Views.E2E_SETUP }); - StorageManager.tryPersistStorage(); - this.setLoggedInState(true); - } else { - // this.onLoggedIn(); - StorageManager.tryPersistStorage(); - this.setLoggedInState(true); - } - this.pendingInitialSyncAndKeySync = false; - }; - - /** - * Logs the current session out and transitions to the logged-out state - */ - public logout = async () => { - if (!MatrixClientPeg.get()) return; - - if (MatrixClientPeg.get().isGuest()) { - // logout doesn't work for guest sessions - // Also we sometimes want to re-log in a guest session if we abort the login. - // defer until next tick because it calls a synchronous dispatch and we are likely here from a dispatch. - setImmediate(() => this.onLoggedOut()); - return; - } - - this._isLoggingOut = true; - const client = MatrixClientPeg.get(); - - // TODO - // destroyPickleKey( - // client.getUserId(), - // client.getDeviceId() - // ); - - try { - await client.logout(); - } catch (e) { - // Just throwing an error here is going to be very unhelpful - // if you're trying to log out because your server's down and - // you want to log into a different server, so just forget the - // access token. It's annoying that this will leave the access - // token still valid, but we should fix this by having access - // tokens expire (and if you really think you've been compromised, - // change your password). - console.log("Failed to call logout API: token will not be invalidated"); - } finally { - await this.onLoggedOut(); - } - }; - - // Source: https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/Lifecycle.ts#L768 - private softLogout(): void { - if (!MatrixClientPeg.get()) { - return; - } - - // Track that we've detected and trapped a soft logout. This helps prevent other - // parts of the app from starting if there's no point (ie: don't sync if we've - // been soft logged out, despite having credentials and data for a MatrixClient). - localStorage.setItem("mx_soft_logout", "true"); - - // Dev note: please keep this log line around. It can be useful for track down - // random clients stopping in the middle of the logs. - console.log("Soft logout initiated"); - this._isLoggingOut = true; // to avoid repeated flags - // Ensure that we dispatch a view change **before** stopping the client so - // so that React components unmount first. This avoids React soft crashes - // that can occur when components try to use a null client. - // dis.dispatch({ action: "on_client_not_viable" }); // generic version of on_logged_out - // this.onSoftLogout(); - this.stopMatrixClient(/*unsetClient=*/ false); - this.setLoggedInState(false); - - // DO NOT CALL LOGOUT. A soft logout preserves data, logout does not. - } - - /* - * Stops a running client and all related services, and clears persistent - * storage. Used after a session has been logged out. - */ - public async onLoggedOut(): Promise { - console.log("onLoggedOut"); - this._isLoggingOut = false; - this.setLoggedInState(false); - // Ensure that we dispatch a view change **before** stopping the client so - // so that React components unmount first. This avoids React soft crashes - // that can occur when components try to use a null client. - // dis.dispatch({ action: "on_logged_out" }, true); - this.stopMatrixClient(); - await clearStorage({ deleteEverything: true }); - } - - /** - * Stop all the background processes related to the current client. - * @param {boolean} unsetClient True (default) to abandon the client - * on MatrixClientPeg after stopping. - * - * Source: https://github.com/matrix-org/matrix-react-sdk/blob/d0d56d4b4293498c07605c17e773b9071e048b0c/src/Lifecycle.ts#L885 - */ - private stopMatrixClient(unsetClient = true): void { - // Notifier.stop(); - // CallHandler.sharedInstance().stop(); - // UserActivity.sharedInstance().stop(); - // TypingStore.sharedInstance().reset(); - // Presence.stop(); - // ActiveWidgetStore.stop(); - // IntegrationManagers.sharedInstance().stopWatching(); - // Mjolnir.sharedInstance().stop(); - // DeviceListener.sharedInstance().stop(); - // if (DMRoomMap.shared()) DMRoomMap.shared().stop(); - // EventIndexPeg.stop(); - this.pendingInitialSyncAndKeySync = true; - this.firstSyncComplete = false; - this.firstSyncPromise = undefined; - const cli = MatrixClientPeg.get(); - if (cli) { - cli.stopClient(); - cli.removeAllListeners(); - - if (unsetClient) { - MatrixClientPeg.unset(); - // EventIndexPeg.unset(); - } - } - } -} diff --git a/packages/editor/src/app/matrix-auth/MatrixClientPeg.ts b/packages/editor/src/app/matrix-auth/MatrixClientPeg.ts deleted file mode 100644 index 917c86b28..000000000 --- a/packages/editor/src/app/matrix-auth/MatrixClientPeg.ts +++ /dev/null @@ -1,356 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd -Copyright 2017 Vector Creations Ltd. -Copyright 2017, 2018, 2019 New Vector Ltd -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -import { ICreateClientOpts, MatrixClient, MemoryStore } from "matrix-js-sdk"; -// import { SHOW_QR_CODE_METHOD } from "matrix-js-sdk/src/crypto/verification/QRCode"; -// import SecurityCustomisations from "./customisations/Security"; -import createMatrixClient from "./createMatrixClient"; -import IdentityAuthClient from "./IdentityAuthClient"; -// import IdentityAuthClient from "./IdentityAuthClient"; -import { - crossSigningCallbacks, - tryToUnlockSecretStorageWithDehydrationKey, -} from "./SecurityManager"; -// import * as utils from "matrix-js-sdk/src/utils"; -// import { EventTimeline } from "matrix-js-sdk/src/models/event-timeline"; -// import { EventTimelineSet } from "matrix-js-sdk/src/models/event-timeline-set"; -// import * as sdk from "./index"; -// import SettingsStore from "./settings/SettingsStore"; -// import MatrixActionCreators from "./actions/MatrixActionCreators"; -// import Modal from "./Modal"; -// import { verificationMethods } from "matrix-js-sdk/src/crypto/index.js"; -// import MatrixClientBackedSettingsHandler from "./settings/handlers/MatrixClientBackedSettingsHandler"; -import * as StorageManager from "./StorageManager"; -import { deepCopy } from "./unexported/utils"; -import { verificationMethods } from "./unexported/verificationMethods"; - -export interface IMatrixClientCreds { - homeserverUrl: string; - identityServerUrl: string; - userId: string; - deviceId?: string; - accessToken: string; - guest?: boolean; - pickleKey?: string; - freshLogin?: boolean; -} - -// TODO: Move this to the js-sdk -export interface IOpts { - initialSyncLimit?: number; - pendingEventOrdering?: "detached" | "chronological"; - lazyLoadMembers?: boolean; - clientWellKnownPollPeriod?: number; -} - -export interface IMatrixClientPeg { - opts: IOpts; - - /** - * Sets the script href passed to the IndexedDB web worker - * If set, a separate web worker will be started to run the IndexedDB - * queries on. - * - * @param {string} script href to the script to be passed to the web worker - */ - setIndexedDbWorkerScript(script: string): void; - - /** - * Return the server name of the user's homeserver - * Throws an error if unable to deduce the homeserver name - * (eg. if the user is not logged in) - * - * @returns {string} The homeserver name, if present. - */ - getHomeserverName(): string; - - get(): MatrixClient; - unset(): void; - assign(): Promise; - start(): Promise; - - getCredentials(): IMatrixClientCreds; - - /** - * If we've registered a user ID we set this to the ID of the - * user we've just registered. If they then go & log in, we - * can send them to the welcome user (obviously this doesn't - * guarentee they'll get a chat with the welcome user). - * - * @param {string} uid The user ID of the user we've just registered - */ - setJustRegisteredUserId(uid: string): void; - - /** - * Returns true if the current user has just been registered by this - * client as determined by setJustRegisteredUserId() - * - * @returns {bool} True if user has just been registered - */ - currentUserIsJustRegistered(): boolean; - - /** - * If the current user has been registered by this device then this - * returns a boolean of whether it was within the last N hours given. - */ - userRegisteredWithinLastHours(hours: number): boolean; - - /** - * Replace this MatrixClientPeg's client with a client instance that has - * homeserver / identity server URLs and active credentials - * - * @param {IMatrixClientCreds} creds The new credentials to use. - */ - replaceUsingCreds(creds: IMatrixClientCreds): void; -} - -/** - * Wrapper object for handling the js-sdk Matrix Client object in the react-sdk - * Handles the creation/initialisation of client objects. - * This module provides a singleton instance of this class so the 'current' - * Matrix Client object is available easily. - */ -class _MatrixClientPeg implements IMatrixClientPeg { - // These are the default options used when when the - // client is started in 'start'. These can be altered - // at any time up to after the 'will_start_client' - // event is finished processing. - public opts: IOpts = { - initialSyncLimit: 0, - pendingEventOrdering: "chronological", - }; - - private matrixClient: MatrixClient = null as any; - private justRegisteredUserId: string | undefined; - - // the credentials used to init the current client object. - // used if we tear it down & recreate it with a different store - private currentClientCreds: IMatrixClientCreds | undefined; - - public setIndexedDbWorkerScript(script: string): void { - (createMatrixClient as any).indexedDbWorkerScript = script; - } - - public get(): MatrixClient { - return this.matrixClient!; - } - - public unset(): void { - this.matrixClient = null as any; - - // MatrixActionCreators.stop(); - } - - public setJustRegisteredUserId(uid: string): void { - this.justRegisteredUserId = uid; - if (uid) { - window.localStorage.setItem( - "mx_registration_time", - String(new Date().getTime()) - ); - } - } - - public currentUserIsJustRegistered(): boolean { - return !!( - this.matrixClient && - this.matrixClient.credentials.userId === this.justRegisteredUserId - ); - } - - public userRegisteredWithinLastHours(hours: number): boolean { - try { - const date = new Date( - window.localStorage.getItem("mx_registration_time")! - ); - return (new Date().getTime() - date.getTime()) / 36e5 <= hours; - } catch (e) { - return false; - } - } - - public replaceUsingCreds(creds: IMatrixClientCreds): void { - this.currentClientCreds = creds; - this.createClient(creds); - } - - public async assign(): Promise { - for (const dbType of ["indexeddb", "memory"]) { - // only use memory store - try { - const promise = this.matrixClient!.store.startup(); - console.log( - "MatrixClientPeg: waiting for MatrixClient store to initialise" - ); - await promise; - break; - } catch (err) { - if (dbType === "indexeddb") { - console.error( - "Error starting matrixclient store - falling back to memory store", - err - ); - (this.matrixClient as any).store = new MemoryStore({ - // TODO - localStorage: localStorage, - }); - } else { - console.error("Failed to start memory store!", err); - throw err; - } - } - } - - StorageManager.trackStores(this.matrixClient); - - // try to initialise e2e on the new client - try { - // check that we have a version of the js-sdk which includes initCrypto - if ( - // !SettingsStore.getValue("lowBandwidth") && - (this.matrixClient! as any).initCrypto // TODO - ) { - await this.matrixClient!.initCrypto(); - this.matrixClient!.setCryptoTrustCrossSignedDevices( - // !SettingsStore.getValue("e2ee.manuallyVerifyAllSessions") - true - ); - await tryToUnlockSecretStorageWithDehydrationKey(this.matrixClient!); - StorageManager.setCryptoInitialised(true); - } - } catch (e) { - // throw new Error("not implemented"); - // if (e && e.name === "InvalidCryptoStoreError") { - // // The js-sdk found a crypto DB too new for it to use - // const CryptoStoreTooNewDialog = sdk.getComponent( - // "views.dialogs.CryptoStoreTooNewDialog" - // ); - // Modal.createDialog(CryptoStoreTooNewDialog); - // } - // this can happen for a number of reasons, the most likely being - // that the olm library was missing. It's not fatal. - console.warn("Unable to initialise e2e", e); - } - - const opts = deepCopy(this.opts); - // the react sdk doesn't work without this, so don't allow - opts.pendingEventOrdering = "chronological"; - opts.lazyLoadMembers = true; - opts.clientWellKnownPollPeriod = 2 * 60 * 60; // 2 hours - - // Connect the matrix client to the dispatcher and setting handlers - // MatrixActionCreators.start(this.matrixClient); - // MatrixClientBackedSettingsHandler.matrixClient = this.matrixClient; - - return opts; - } - - public async start(): Promise { - const opts = await this.assign(); - (this.get() as any).canSupportVoip = false; // TC added - console.log(`MatrixClientPeg: really starting MatrixClient`); - await this.get().startClient(opts); - console.log(`MatrixClientPeg: MatrixClient started`); - } - - public getCredentials(): IMatrixClientCreds { - return { - homeserverUrl: this.matrixClient.baseUrl, - identityServerUrl: this.matrixClient.idBaseUrl, - userId: this.matrixClient.credentials.userId!, - deviceId: this.matrixClient.getDeviceId(), - accessToken: this.matrixClient.getAccessToken()!, - guest: this.matrixClient.isGuest(), - }; - } - - public getHomeserverName(): string { - const matches = /^@[^:]+:(.+)$/.exec(this.matrixClient.credentials.userId!); - if (matches === null || matches.length < 1) { - throw new Error("Failed to derive homeserver name from user ID!"); - } - return matches[1]; - } - - private createClient(creds: IMatrixClientCreds): void { - const opts: ICreateClientOpts = { - baseUrl: creds.homeserverUrl, - idBaseUrl: creds.identityServerUrl, - accessToken: creds.accessToken, - userId: creds.userId, - deviceId: creds.deviceId, - pickleKey: creds.pickleKey, - timelineSupport: true, - // forceTURN: !SettingsStore.getValue("webRtcAllowPeerToPeer"), - // fallbackICEServerAllowed: !!SettingsStore.getValue( - // "fallbackICEServerAllowed" - // ), - // Gather up to 20 ICE candidates when a call arrives: this should be more than we'd - // ever normally need, so effectively this should make all the gathering happen when - // the call arrives. - iceCandidatePoolSize: 20, - verificationMethods: [ - verificationMethods.SAS, - verificationMethods.SHOW_QR_CODE_METHOD, - verificationMethods.RECIPROCATE_QR_CODE, - ], - - // unstableClientRelationAggregation: true, - identityServer: new IdentityAuthClient(), - cryptoCallbacks: {} as any, - }; - - // These are always installed regardless of the labs flag so that - // cross-signing features can toggle on without reloading and also be - // accessed immediately after login. - Object.assign(opts.cryptoCallbacks!, crossSigningCallbacks); - // if (SecurityCustomisations.getDehydrationKey) { - // opts.cryptoCallbacks.getDehydrationKey = - // SecurityCustomisations.getDehydrationKey; - // } - - this.matrixClient = createMatrixClient(opts); - - // overwrites because we don't call .start(); - (this.matrixClient as any).canSupportVoip = false; - (this.matrixClient as any).clientOpts = { - lazyLoadMembers: true, - }; - - // we're going to add eventlisteners for each matrix event tile, so the - // potential number of event listeners is quite high. - this.matrixClient.setMaxListeners(500); - - this.matrixClient.setGuest(Boolean(creds.guest)); - - // const notifTimelineSet = new EventTimelineSet(null, { - // timelineSupport: true, - // }); - // // XXX: what is our initial pagination token?! it somehow needs to be synchronised with /sync. - // notifTimelineSet - // .getLiveTimeline() - // .setPaginationToken("", EventTimeline.BACKWARDS); - // this.matrixClient.setNotifTimelineSet(notifTimelineSet); - } -} - -if (!(window as any).mxMatrixClientPeg) { - (window as any).mxMatrixClientPeg = new _MatrixClientPeg(); -} - -export const MatrixClientPeg = (window as any).mxMatrixClientPeg; diff --git a/packages/editor/src/app/matrix-auth/SecurityManager.ts b/packages/editor/src/app/matrix-auth/SecurityManager.ts deleted file mode 100644 index e1f68b1a4..000000000 --- a/packages/editor/src/app/matrix-auth/SecurityManager.ts +++ /dev/null @@ -1,521 +0,0 @@ -/* -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import * as mxSdk from "matrix-js-sdk"; -import { ICryptoCallbacks, MatrixClient } from "matrix-js-sdk"; -// import type { ISecretStorageKeyInfo } from "matrix-js-sdk/src/crypto/api"; -// import type { DeviceTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning"; -// import { deriveKey } from "matrix-js-sdk/src/crypto/key_passphrase"; -// import { decodeRecoveryKey } from "matrix-js-sdk/src/crypto/recoverykey"; -// import Modal from "./Modal"; -// import * as sdk from "./index"; -import { base64 } from "@typecell-org/common"; -import { MatrixClientPeg } from "./MatrixClientPeg"; -// import { isSecureBackupRequired } from "./utils/WellKnownUtils"; -// import AccessSecretStorageDialog from "./components/views/dialogs/security/AccessSecretStorageDialog"; -// import RestoreKeyBackupDialog from "./components/views/dialogs/security/RestoreKeyBackupDialog"; -// import SettingsStore from "./settings/SettingsStore"; -// import SecurityCustomisations from "./customisations/Security"; - -type ISecretStorageKeyInfo = any; -type DeviceTrustLevel = any; -// This stores the secret storage private keys in memory for the JS SDK. This is -// only meant to act as a cache to avoid prompting the user multiple times -// during the same single operation. Use `accessSecretStorage` below to scope a -// single secret storage operation, as it will clear the cached keys once the -// operation ends. -let secretStorageKeys: Record = {}; -let secretStorageKeyInfo: Record = {}; -let secretStorageBeingAccessed = false; - -let nonInteractive = false; - -let dehydrationCache: { - key?: Uint8Array; - keyInfo?: ISecretStorageKeyInfo; -} = {}; - -function isCachingAllowed(): boolean { - return secretStorageBeingAccessed; -} - -/** - * This can be used by other components to check if secret storage access is in - * progress, so that we can e.g. avoid intermittently showing toasts during - * secret storage setup. - * - * @returns {bool} - */ -export function isSecretStorageBeingAccessed(): boolean { - return secretStorageBeingAccessed; -} - -export class AccessCancelledError extends Error { - constructor() { - super("Secret storage access canceled"); - } -} - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -async function confirmToDismiss(): Promise { - throw new Error("not implemented"); - // const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - // const [sure] = await Modal.createDialog(QuestionDialog, { - // title: _t("Cancel entering passphrase?"), - // description: _t("Are you sure you want to cancel entering passphrase?"), - // danger: false, - // button: _t("Go Back"), - // cancelButton: _t("Cancel"), - // }).finished; - // return !sure; -} - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function makeInputToKey( - keyInfo: ISecretStorageKeyInfo -): (keyParams: { - passphrase: string; - recoveryKey: string; -}) => Promise { - return async ({ passphrase, recoveryKey }) => { - if (passphrase) { - return (mxSdk as any).deriveKey( - passphrase, - keyInfo.passphrase.salt, - keyInfo.passphrase.iterations - ); - } else { - return (mxSdk as any).decodeRecoveryKey(recoveryKey); - } - }; -} - -async function getSecretStorageKey({ - keys: keyInfos, -}: { - keys: Record; -}): Promise<[string, Uint8Array]> { - const cli = MatrixClientPeg.get(); - let keyId = await cli.getDefaultSecretStorageKeyId(); - let keyInfo: ISecretStorageKeyInfo; - if (keyId) { - // use the default SSSS key if set - keyInfo = keyInfos[keyId]; - if (!keyInfo) { - // if the default key is not available, pretend the default key - // isn't set - keyId = undefined; - } - } - if (!keyId) { - // if no default SSSS key is set, fall back to a heuristic of using the - // only available key, if only one key is set - const keyInfoEntries = Object.entries(keyInfos); - if (keyInfoEntries.length > 1) { - throw new Error("Multiple storage key requests not implemented"); - } - [keyId, keyInfo] = keyInfoEntries[0]; - } - - // Check the in-memory cache - if (isCachingAllowed() && secretStorageKeys[keyId]) { - return [keyId, secretStorageKeys[keyId]]; - } - - if (dehydrationCache.key) { - if ( - await MatrixClientPeg.get().checkSecretStorageKey( - dehydrationCache.key, - keyInfo! - ) - ) { - cacheSecretStorageKey(keyId, keyInfo!, dehydrationCache.key); - return [keyId, dehydrationCache.key]; - } - } - - // const keyFromCustomisations = SecurityCustomisations.getSecretStorageKey?.(); - // if (keyFromCustomisations) { - // console.log("Using key from security customisations (secret storage)"); - // cacheSecretStorageKey(keyId, keyInfo, keyFromCustomisations); - // return [keyId, keyFromCustomisations]; - // } - - if (nonInteractive) { - throw new Error("Could not unlock non-interactively"); - } - - throw new Error("not implemented"); - - // const inputToKey = makeInputToKey(keyInfo); - // const { finished } = Modal.createTrackedDialog( - // "Access Secret Storage dialog", - // "", - // AccessSecretStorageDialog, - // /* props= */ - // { - // keyInfo, - // checkPrivateKey: async (input) => { - // const key = await inputToKey(input); - // return await MatrixClientPeg.get().checkSecretStorageKey(key, keyInfo); - // }, - // }, - // /* className= */ null, - // /* isPriorityModal= */ false, - // /* isStaticModal= */ false, - // /* options= */ { - // onBeforeClose: async (reason) => { - // if (reason === "backgroundClick") { - // return confirmToDismiss(); - // } - // return true; - // }, - // } - // ); - // const [input] = await finished; - // if (!input) { - // throw new AccessCancelledError(); - // } - // const key = await inputToKey(input); - - // // Save to cache to avoid future prompts in the current session - // cacheSecretStorageKey(keyId, keyInfo, key); - - // return [keyId, key]; -} - -export async function getDehydrationKey( - keyInfo: ISecretStorageKeyInfo, - checkFunc: (arg: Uint8Array) => void -): Promise { - // const keyFromCustomisations = SecurityCustomisations.getSecretStorageKey?.(); - // if (keyFromCustomisations) { - // console.log("Using key from security customisations (dehydration)"); - // return keyFromCustomisations; - // } - - throw new Error("not implemented"); - - // const inputToKey = makeInputToKey(keyInfo); - // const { finished } = Modal.createTrackedDialog( - // "Access Secret Storage dialog", - // "", - // AccessSecretStorageDialog, - // /* props= */ - // { - // keyInfo, - // checkPrivateKey: async (input) => { - // const key = await inputToKey(input); - // try { - // checkFunc(key); - // return true; - // } catch (e) { - // return false; - // } - // }, - // }, - // /* className= */ null, - // /* isPriorityModal= */ false, - // /* isStaticModal= */ false, - // /* options= */ { - // onBeforeClose: async (reason) => { - // if (reason === "backgroundClick") { - // return confirmToDismiss(); - // } - // return true; - // }, - // } - // ); - // const [input] = await finished; - // if (!input) { - // throw new AccessCancelledError(); - // } - // const key = await inputToKey(input); - - // // need to copy the key because rehydration (unpickling) will clobber it - // dehydrationCache = { key: new Uint8Array(key), keyInfo }; - - // return key; -} - -function cacheSecretStorageKey( - keyId: string, - keyInfo: ISecretStorageKeyInfo, - key: Uint8Array -): void { - if (isCachingAllowed()) { - secretStorageKeys[keyId] = key; - secretStorageKeyInfo[keyId] = keyInfo; - } -} - -async function onSecretRequested( - userId: string, - deviceId: string, - requestId: string, - name: string, - deviceTrust: DeviceTrustLevel -): Promise { - console.log( - "onSecretRequested", - userId, - deviceId, - requestId, - name, - deviceTrust - ); - const client = MatrixClientPeg.get(); - if (userId !== client.getUserId()) { - return undefined as any; - } - if (!deviceTrust || !deviceTrust.isVerified()) { - console.log(`Ignoring secret request from untrusted device ${deviceId}`); - return undefined as any; - } - if ( - name === "m.cross_signing.master" || - name === "m.cross_signing.self_signing" || - name === "m.cross_signing.user_signing" - ) { - const callbacks = client.getCrossSigningCacheCallbacks(); - if (!callbacks.getCrossSigningKeyCache) return undefined as any; - const keyId = name.replace("m.cross_signing.", ""); - const key = await callbacks.getCrossSigningKeyCache(keyId); - if (!key) { - console.log(`${keyId} requested by ${deviceId}, but not found in cache`); - } - return key && base64.encodeBase64(key); - } else if (name === "m.megolm_backup.v1") { - const key = await client._crypto.getSessionBackupPrivateKey(); - if (!key) { - console.log( - `session backup key requested by ${deviceId}, but not found in cache` - ); - } - return key && base64.encodeBase64(key); - } - console.warn("onSecretRequested didn't recognise the secret named ", name); - return undefined as any; -} - -export const crossSigningCallbacks: ICryptoCallbacks = { - getSecretStorageKey, - cacheSecretStorageKey, - onSecretRequested, - getDehydrationKey, -}; - -export async function promptForBackupPassphrase(): Promise { - // let key; - throw new Error("not implemented"); - // const { finished } = Modal.createTrackedDialog( - // "Restore Backup", - // "", - // RestoreKeyBackupDialog, - // { - // showSummary: false, - // keyCallback: (k) => (key = k), - // }, - // null, - // /* priority = */ false, - // /* static = */ true - // ); - - // const success = await finished; - // if (!success) throw new Error("Key backup prompt cancelled"); - - // return key; -} - -/** - * This helper should be used whenever you need to access secret storage. It - * ensures that secret storage (and also cross-signing since they each depend on - * each other in a cycle of sorts) have been bootstrapped before running the - * provided function. - * - * Bootstrapping secret storage may take one of these paths: - * 1. Create secret storage from a passphrase and store cross-signing keys - * in secret storage. - * 2. Access existing secret storage by requesting passphrase and accessing - * cross-signing keys as needed. - * 3. All keys are loaded and there's nothing to do. - * - * Additionally, the secret storage keys are cached during the scope of this function - * to ensure the user is prompted only once for their secret storage - * passphrase. The cache is then cleared once the provided function completes. - * - * @param {Function} [func] An operation to perform once secret storage has been - * bootstrapped. Optional. - * @param {bool} [forceReset] Reset secret storage even if it's already set up - */ -export async function accessSecretStorage( - func = async () => {}, - forceReset = false -) { - const cli = MatrixClientPeg.get(); - secretStorageBeingAccessed = true; - try { - if (!(await cli.hasSecretStorageKey()) || forceReset) { - throw new Error("not implemented"); - // This dialog calls bootstrap itself after guiding the user through - // passphrase creation. - // const { finished } = Modal.createTrackedDialogAsync( - // "Create Secret Storage dialog", - // "", - // import( - // "./async-components/views/dialogs/security/CreateSecretStorageDialog" - // ), - // { - // forceReset, - // }, - // null, - // /* priority = */ false, - // /* static = */ true, - // /* options = */ { - // onBeforeClose: async (reason) => { - // // If Secure Backup is required, you cannot leave the modal. - // if (reason === "backgroundClick") { - // return !isSecureBackupRequired(); - // } - // return true; - // }, - // } - // ); - // const [confirmed] = await finished; - // if (!confirmed) { - // throw new Error("Secret storage creation canceled"); - // } - } else { - throw new Error("not implemented"); - // const InteractiveAuthDialog = sdk.getComponent( - // "dialogs.InteractiveAuthDialog" - // ); - // await cli.bootstrapCrossSigning({ - // authUploadDeviceSigningKeys: async (makeRequest) => { - // const { finished } = Modal.createTrackedDialog( - // "Cross-signing keys dialog", - // "", - // InteractiveAuthDialog, - // { - // title: _t("Setting up keys"), - // matrixClient: cli, - // makeRequest, - // } - // ); - // const [confirmed] = await finished; - // if (!confirmed) { - // throw new Error("Cross-signing key upload auth canceled"); - // } - // }, - // }); - // await cli.bootstrapSecretStorage({ - // getKeyBackupPassphrase: promptForBackupPassphrase, - // }); - - // const keyId = Object.keys(secretStorageKeys)[0]; - // if (keyId && SettingsStore.getValue("feature_dehydration")) { - // let dehydrationKeyInfo = {}; - // if ( - // secretStorageKeyInfo[keyId] && - // secretStorageKeyInfo[keyId].passphrase - // ) { - // dehydrationKeyInfo = { - // passphrase: secretStorageKeyInfo[keyId].passphrase, - // }; - // } - // console.log("Setting dehydration key"); - // await cli.setDehydrationKey( - // secretStorageKeys[keyId], - // dehydrationKeyInfo, - // "Backup device" - // ); - // } else if (!keyId) { - // console.warn("Not setting dehydration key: no SSSS key found"); - // } else { - // console.log("Not setting dehydration key: feature disabled"); - // } - } - - // `return await` needed here to ensure `finally` block runs after the - // inner operation completes. - // return await func(); - } catch (e) { - // SecurityCustomisations.catchAccessSecretStorageError?.(e); - console.error(e); - // Re-throw so that higher level logic can abort as needed - throw e; - } finally { - // Clear secret storage key cache now that work is complete - secretStorageBeingAccessed = false; - if (!isCachingAllowed()) { - secretStorageKeys = {}; - secretStorageKeyInfo = {}; - } - } -} - -// FIXME: this function name is a bit of a mouthful -export async function tryToUnlockSecretStorageWithDehydrationKey( - client: MatrixClient -): Promise { - const key = dehydrationCache.key; - let restoringBackup = false; - if (key && (await client.isSecretStorageReady())) { - console.log("Trying to set up cross-signing using dehydration key"); - secretStorageBeingAccessed = true; - nonInteractive = true; - try { - await client.checkOwnCrossSigningTrust(); - - // we also need to set a new dehydrated device to replace the - // device we rehydrated - let dehydrationKeyInfo = {}; - if (dehydrationCache.keyInfo && dehydrationCache.keyInfo.passphrase) { - dehydrationKeyInfo = { - passphrase: dehydrationCache.keyInfo.passphrase, - }; - } - await client.setDehydrationKey(key, dehydrationKeyInfo, "Backup device"); - - // and restore from backup - const backupInfo = await client.getKeyBackupVersion(); - if (backupInfo) { - restoringBackup = true; - // don't await, because this can take a long time - client.restoreKeyBackupWithSecretStorage(backupInfo).finally(() => { - secretStorageBeingAccessed = false; - nonInteractive = false; - if (!isCachingAllowed()) { - secretStorageKeys = {}; - secretStorageKeyInfo = {}; - } - }); - } - } finally { - dehydrationCache = {}; - // the secret storage cache is needed for restoring from backup, so - // don't clear it yet if we're restoring from backup - if (!restoringBackup) { - secretStorageBeingAccessed = false; - nonInteractive = false; - if (!isCachingAllowed()) { - secretStorageKeys = {}; - secretStorageKeyInfo = {}; - } - } - } - } -} diff --git a/packages/editor/src/app/matrix-auth/StorageManager.ts b/packages/editor/src/app/matrix-auth/StorageManager.ts deleted file mode 100644 index 7bde836c2..000000000 --- a/packages/editor/src/app/matrix-auth/StorageManager.ts +++ /dev/null @@ -1,254 +0,0 @@ -/* -Copyright 2019-2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// https://raw.githubusercontent.com/matrix-org/matrix-react-sdk/develop/src/utils/StorageManager.ts - -import { IndexedDBCryptoStore, IndexedDBStore } from "matrix-js-sdk"; - -const localStorage = window.localStorage; - -// just *accessing* indexedDB throws an exception in firefox with -// indexeddb disabled. -let indexedDB: IDBFactory | undefined; -try { - indexedDB = window.indexedDB; -} catch (e) {} - -// The JS SDK will add a prefix of "matrix-js-sdk:" to the sync store name. -const SYNC_STORE_NAME = "typecell-web-sync"; -const CRYPTO_STORE_NAME = "matrix-js-sdk:crypto"; - -function log(msg: string) { - console.log(`StorageManager: ${msg}`); -} - -function error(msg: string, ...args: string[]) { - console.error(`StorageManager: ${msg}`, ...args); -} - -export function tryPersistStorage() { - if (navigator.storage && navigator.storage.persist) { - navigator.storage.persist().then((persistent) => { - console.log("StorageManager: Persistent?", persistent); - }); - } else if ((document as any).requestStorageAccess) { - // Safari - (document as any).requestStorageAccess().then( - () => console.log("StorageManager: Persistent?", true), - () => console.log("StorageManager: Persistent?", false) - ); - } else { - console.log("StorageManager: Persistence unsupported"); - } -} - -export async function checkConsistency() { - log("Checking storage consistency"); - log(`Local storage supported? ${!!localStorage}`); - log(`IndexedDB supported? ${!!indexedDB}`); - - let dataInLocalStorage = false; - let dataInCryptoStore = false; - let cryptoInited = false; - let healthy = true; - - if (localStorage) { - dataInLocalStorage = localStorage.length > 0; - log(`Local storage contains data? ${dataInLocalStorage}`); - - cryptoInited = !!localStorage.getItem("mx_crypto_initialised"); - log(`Crypto initialised? ${cryptoInited}`); - } else { - healthy = false; - error("Local storage cannot be used on this browser"); - } - - if (indexedDB && localStorage) { - const results = await checkSyncStore(); - if (!results.healthy) { - healthy = false; - } - } else { - healthy = false; - error("Sync store cannot be used on this browser"); - } - - if (indexedDB) { - const results = await checkCryptoStore(); - dataInCryptoStore = results.exists; - if (!results.healthy) { - healthy = false; - } - } else { - healthy = false; - error("Crypto store cannot be used on this browser"); - } - - if (dataInLocalStorage && cryptoInited && !dataInCryptoStore) { - healthy = false; - error( - "Data exists in local storage and crypto is marked as initialised " + - " but no data found in crypto store. " + - "IndexedDB storage has likely been evicted by the browser!" - ); - } - - if (healthy) { - log("Storage consistency checks passed"); - } else { - error("Storage consistency checks failed"); - } - - return { - dataInLocalStorage, - dataInCryptoStore, - cryptoInited, - healthy, - }; -} - -async function checkSyncStore() { - let exists = false; - try { - exists = await IndexedDBStore.exists(indexedDB!, SYNC_STORE_NAME); - log(`Sync store using IndexedDB contains data? ${exists}`); - return { exists, healthy: true }; - } catch (e: any) { - error("Sync store using IndexedDB inaccessible", e); - } - log("Sync store using memory only"); - return { exists, healthy: false }; -} - -async function checkCryptoStore() { - let exists = false; - try { - exists = await IndexedDBCryptoStore.exists(indexedDB!, CRYPTO_STORE_NAME); - log(`Crypto store using IndexedDB contains data? ${exists}`); - return { exists, healthy: true }; - } catch (e: any) { - error("Crypto store using IndexedDB inaccessible", e); - } - - log("Crypto store using memory only"); - return { exists, healthy: false }; -} - -export function trackStores(client: any) { - if (client.store && client.store.on) { - client.store.on("degraded", () => { - // track("Sync store using IndexedDB degraded to memory"); - }); - } -} - -/** - * Sets whether crypto has ever been successfully - * initialised on this client. - * StorageManager uses this to determine whether indexeddb - * has been wiped by the browser: this flag is saved to localStorage - * and if it is true and not crypto data is found, an error is - * presented to the user. - * - * @param {bool} cryptoInited True if crypto has been set up - */ -export function setCryptoInitialised(cryptoInited: boolean) { - localStorage.setItem("mx_crypto_initialised", cryptoInited + ""); -} - -/* Simple wrapper functions around IndexedDB. - */ - -let idb: IDBDatabase | undefined; - -async function idbInit(): Promise { - if (!indexedDB) { - throw new Error("IndexedDB not available"); - } - idb = await new Promise((resolve, reject) => { - const request = indexedDB!.open("matrix-react-sdk", 1); - request.onerror = reject; - request.onsuccess = (event) => { - resolve(request.result); - }; - request.onupgradeneeded = (event) => { - const db = request.result; - db.createObjectStore("pickleKey"); - db.createObjectStore("account"); - }; - }); -} - -export async function idbLoad( - table: string, - key: string | string[] -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readonly"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.get(key); - request.onerror = reject; - request.onsuccess = (event) => { - resolve(request.result); - }; - }); -} - -export async function idbSave( - table: string, - key: string | string[], - data: any -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.put(data, key); - request.onerror = reject; - request.onsuccess = (event) => { - resolve(); - }; - }); -} - -export async function idbDelete( - table: string, - key: string | string[] -): Promise { - if (!idb) { - await idbInit(); - } - return new Promise((resolve, reject) => { - const txn = idb!.transaction([table], "readwrite"); - txn.onerror = reject; - - const objectStore = txn.objectStore(table); - const request = objectStore.delete(key); - request.onerror = reject; - request.onsuccess = (event) => { - resolve(); - }; - }); -} diff --git a/packages/editor/src/app/matrix-auth/Terms.ts b/packages/editor/src/app/matrix-auth/Terms.ts deleted file mode 100644 index 6c5bfc60f..000000000 --- a/packages/editor/src/app/matrix-auth/Terms.ts +++ /dev/null @@ -1,201 +0,0 @@ -/* -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { MatrixClientPeg } from "./MatrixClientPeg"; - -export class TermsNotSignedError extends Error {} - -/** - * Class representing a service that may have terms & conditions that - * require agreement from the user before the user can use that service. - */ -export class Service { - /** - * @param {MatrixClient.SERVICE_TYPES} serviceType The type of service - * @param {string} baseUrl The Base URL of the service (ie. before '/_matrix') - * @param {string} accessToken The user's access token for the service - */ - constructor( - private serviceType: any, - private baseUrl: string, - private accessToken: string - ) {} -} - -/** - * Start a flow where the user is presented with terms & conditions for some services - * - * @param {Service[]} services Object with keys 'serviceType', 'baseUrl', 'accessToken' - * @param {function} interactionCallback Function called with: - * * an array of { service: {Service}, policies: {terms response from API} } - * * an array of URLs the user has already agreed to - * Must return a Promise which resolves with a list of URLs of documents agreed to - * @returns {Promise} resolves when the user agreed to all necessary terms or rejects - * if they cancel. - */ -export async function startTermsFlow( - services: any, - interactionCallback = dialogTermsInteractionCallback -) { - const termsPromises = services.map((s: any) => - MatrixClientPeg.get().getTerms(s.serviceType, s.baseUrl) - ); - - /* - * a /terms response looks like: - * { - * "policies": { - * "terms_of_service": { - * "version": "2.0", - * "en": { - * "name": "Terms of Service", - * "url": "https://example.org/somewhere/terms-2.0-en.html" - * }, - * "fr": { - * "name": "Conditions d'utilisation", - * "url": "https://example.org/somewhere/terms-2.0-fr.html" - * } - * } - * } - * } - */ - - const terms = await Promise.all(termsPromises); - const policiesAndServicePairs = terms.map((t: any, i) => { - return { service: services[i], policies: t.policies }; - }); - - // fetch the set of agreed policy URLs from account data - const currentAcceptedTerms = await MatrixClientPeg.get().getAccountData( - "m.accepted_terms" - ); - let agreedUrlSet: Set; - if ( - !currentAcceptedTerms || - !currentAcceptedTerms.getContent() || - !currentAcceptedTerms.getContent().accepted - ) { - agreedUrlSet = new Set(); - } else { - agreedUrlSet = new Set(currentAcceptedTerms.getContent().accepted); - } - - // remove any policies the user has already agreed to and any services where - // they've already agreed to all the policies - // NB. it could be nicer to show the user stuff they've already agreed to, - // but then they'd assume they can un-check the boxes to un-agree to a policy, - // but that is not a thing the API supports, so probably best to just show - // things they've not agreed to yet. - const unagreedPoliciesAndServicePairs = []; - for (const { service, policies } of policiesAndServicePairs) { - const unagreedPolicies: any = {}; - for (const [policyName, policy] of Object.entries(policies) as any) { - let policyAgreed = false; - for (const lang of Object.keys(policy)) { - if (lang === "version") continue; - if (agreedUrlSet.has(policy[lang].url)) { - policyAgreed = true; - break; - } - } - if (!policyAgreed) unagreedPolicies[policyName] = policy; - } - if (Object.keys(unagreedPolicies).length > 0) { - unagreedPoliciesAndServicePairs.push({ - service, - policies: unagreedPolicies, - }); - } - } - - // if there's anything left to agree to, prompt the user - const numAcceptedBeforeAgreement = agreedUrlSet.size; - if (unagreedPoliciesAndServicePairs.length > 0) { - const newlyAgreedUrls = await interactionCallback( - unagreedPoliciesAndServicePairs, - [...agreedUrlSet] - ); - console.log("User has agreed to URLs", newlyAgreedUrls); - // Merge with previously agreed URLs - newlyAgreedUrls.forEach((url: string) => agreedUrlSet.add(url)); - } else { - console.log("User has already agreed to all required policies"); - } - - // We only ever add to the set of URLs, so if anything has changed then we'd see a different length - if (agreedUrlSet.size !== numAcceptedBeforeAgreement) { - const newAcceptedTerms = { accepted: Array.from(agreedUrlSet) }; - await MatrixClientPeg.get().setAccountData( - "m.accepted_terms", - newAcceptedTerms - ); - } - - const agreePromises = policiesAndServicePairs.map((policiesAndService) => { - // filter the agreed URL list for ones that are actually for this service - // (one URL may be used for multiple services) - // Not a particularly efficient loop but probably fine given the numbers involved - const urlsForService = Array.from(agreedUrlSet).filter((url) => { - for (const policy of Object.values(policiesAndService.policies as any)) { - for (const lang of Object.keys(policy as any)) { - if (lang === "version") continue; - if ((policy as any)[lang].url === url) return true; - } - } - return false; - }); - - if (urlsForService.length === 0) return Promise.resolve(); - - return MatrixClientPeg.get().agreeToTerms( - policiesAndService.service.serviceType, - policiesAndService.service.baseUrl, - policiesAndService.service.accessToken, - urlsForService - ); - }); - return Promise.all(agreePromises); -} - -export function dialogTermsInteractionCallback( - policiesAndServicePairs: any, - agreedUrls: any, - extraClassNames?: any -): Promise { - throw new Error("not implemented"); - // return new Promise((resolve, reject) => { - // console.log("Terms that need agreement", policiesAndServicePairs); - // const TermsDialog = sdk.getComponent("views.dialogs.TermsDialog"); - - // Modal.createTrackedDialog( - // "Terms of Service", - // "", - // TermsDialog, - // { - // policiesAndServicePairs, - // agreedUrls, - // onFinished: (done, agreedUrls) => { - // if (!done) { - // reject(new TermsNotSignedError()); - // return; - // } - // resolve(agreedUrls); - // }, - // }, - // classNames("mx_TermsDialog", extraClassNames) - // ); - // }); -} diff --git a/packages/editor/src/app/matrix-auth/auth/InteractiveAuth.tsx b/packages/editor/src/app/matrix-auth/auth/InteractiveAuth.tsx deleted file mode 100644 index a221bafd3..000000000 --- a/packages/editor/src/app/matrix-auth/auth/InteractiveAuth.tsx +++ /dev/null @@ -1,322 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd. -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { InteractiveAuth } from "matrix-js-sdk"; -import React, { createRef } from "react"; -import Spinner from "./elements/Spinner"; -import getEntryComponentForLoginType from "./views/InteractiveAuthEntryComponents"; - -export const ERROR_USER_CANCELLED = new Error("User cancelled auth session"); - -type IProps = { - // matrix client to use for UI auth requests - matrixClient: any; - - // response from initial request. If not supplied, will do a request on - // mount. - authData?: { - flows: any[]; - params: any; - session: string; - }; - - // callback - makeRequest: (params: any) => any; - - // callback called when the auth process has finished, - // successfully or unsuccessfully. - // @param {bool} status True if the operation requiring - // auth was completed sucessfully, false if canceled. - // @param {object} result The result of the authenticated call - // if successful, otherwise the error object. - // @param {object} extra Additional information about the UI Auth - // process: - // * emailSid {string} If email auth was performed, the sid of - // the auth session. - // * clientSecret {string} The client secret used in auth - // sessions with the ID server. - onAuthFinished: ( - status: boolean, - result: any, - extra?: { emailSid?: string; clientSecret: string } - ) => void; - - // Inputs provided by the user to the auth process - // and used by various stages. As passed to js-sdk - // interactive-auth - inputs: any; - - // As js-sdk interactive-auth - requestEmailToken: (...args: any) => Promise; - sessionId?: string; - clientSecret?: string; - emailSid?: string; - - // If true, poll to see if the auth flow has been completed - // out-of-band - poll: boolean; - - // If true, components will be told that the 'Continue' button - // is managed by some other party and should not be managed by - // the component itself. - continueIsManaged?: boolean; - - // Called when the stage changes, or the stage's phase changes. First - // argument is the stage, second is the phase. Some stages do not have - // phases and will be counted as 0 (numeric). - onStagePhaseChange?: (stage: any, phase: number) => void; - - // continueText and continueKind are passed straight through to the AuthEntryComponent. - continueText?: string; - continueKind?: string; -}; - -type State = { - authStage: any; - busy: boolean; - errorText?: string; - stageErrorText?: string; - submitButtonEnabled: boolean; - stageState: any; -}; - -export default class InteractiveAuthComponent extends React.Component< - IProps, - State -> { - private _unmounted = false; - private _authLogic: any; - private _intervalId: ReturnType | undefined; - private _stageComponent: React.RefObject; - - constructor(props: IProps) { - super(props); - - this.state = { - authStage: null, - busy: false, - errorText: undefined, - stageErrorText: undefined, - submitButtonEnabled: false, - stageState: null, - }; - - this._unmounted = false; - this._authLogic = new InteractiveAuth({ - authData: this.props.authData, - doRequest: this._requestCallback, - busyChanged: this._onBusyChanged, - inputs: this.props.inputs, - stateUpdated: this._authStateUpdated, - matrixClient: this.props.matrixClient, - sessionId: this.props.sessionId, - clientSecret: this.props.clientSecret, - emailSid: this.props.emailSid, - requestEmailToken: this._requestEmailToken, - }); - - if (this.props.poll) { - this._intervalId = setInterval(() => { - this._authLogic.poll(); - }, 2000); - } - - this._stageComponent = createRef(); - } - - // TODO: [REACT-WARNING] Replace component with real class, use constructor for refs - UNSAFE_componentWillMount() { - // eslint-disable-line camelcase - this._authLogic - .attemptAuth() - .then((result: any) => { - const extra = { - emailSid: this._authLogic.getEmailSid(), - clientSecret: this._authLogic.getClientSecret(), - }; - this.props.onAuthFinished(true, result, extra); - }) - .catch((error: any) => { - this.props.onAuthFinished(false, error); - console.error("Error during user-interactive auth:", error); - if (this._unmounted) { - return; - } - - const msg = error.message || error.toString(); - this.setState({ - errorText: msg, - }); - }); - } - - componentWillUnmount() { - this._unmounted = true; - - if (this._intervalId) { - clearInterval(this._intervalId); - } - } - - _requestEmailToken = async (...args: any) => { - this.setState({ - busy: true, - }); - try { - return await this.props.requestEmailToken(...args); - } finally { - this.setState({ - busy: false, - }); - } - }; - - tryContinue = () => { - if ( - this._stageComponent.current && - this._stageComponent.current.tryContinue - ) { - this._stageComponent.current.tryContinue(); - } - }; - - _authStateUpdated = (stageType: any, stageState: any) => { - const oldStage = this.state.authStage; - this.setState( - { - busy: false, - authStage: stageType, - stageState: stageState, - errorText: stageState.error, - }, - () => { - if (oldStage !== stageType) { - this._setFocus(); - } else if ( - !stageState.error && - this._stageComponent.current && - this._stageComponent.current.attemptFailed - ) { - this._stageComponent.current.attemptFailed(); - } - } - ); - }; - - _requestCallback = (auth: any) => { - // This wrapper just exists because the js-sdk passes a second - // 'busy' param for backwards compat. This throws the tests off - // so discard it here. - return this.props.makeRequest(auth); - }; - - _onBusyChanged = (busy: any) => { - // if we've started doing stuff, reset the error messages - if (busy) { - this.setState({ - busy: true, - errorText: undefined, - stageErrorText: undefined, - }); - } - // The JS SDK eagerly reports itself as "not busy" right after any - // immediate work has completed, but that's not really what we want at - // the UI layer, so we ignore this signal and show a spinner until - // there's a new screen to show the user. This is implemented by setting - // `busy: false` in `_authStateUpdated`. - // See also https://github.com/vector-im/element-web/issues/12546 - }; - - _setFocus() { - if (this._stageComponent.current && this._stageComponent.current.focus) { - this._stageComponent.current.focus(); - } - } - - _submitAuthDict = (authData: any) => { - this._authLogic.submitAuthDict(authData); - }; - - _onPhaseChange = (newPhase: any) => { - if (this.props.onStagePhaseChange) { - this.props.onStagePhaseChange(this.state.authStage, newPhase || 0); - } - }; - - _onStageCancel = () => { - this.props.onAuthFinished(false, ERROR_USER_CANCELLED); - }; - - _renderCurrentStage() { - const stage = this.state.authStage; - if (!stage) { - if (this.state.busy) { - return ; - } else { - return null; - } - } - - const StageComponent = getEntryComponentForLoginType(stage) as any; - return ( - - ); - } - - _onAuthStageFailed = (e: any) => { - this.props.onAuthFinished(false, e); - }; - - _setEmailSid = (sid: any) => { - this._authLogic.setEmailSid(sid); - }; - - render() { - let error = null; - if (this.state.errorText) { - error =
{this.state.errorText}
; - } - - return ( -
-
- {this._renderCurrentStage()} - {error} -
-
- ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/Login.tsx b/packages/editor/src/app/matrix-auth/auth/Login.tsx deleted file mode 100644 index 6d17738df..000000000 --- a/packages/editor/src/app/matrix-auth/auth/Login.tsx +++ /dev/null @@ -1,642 +0,0 @@ -/* -Copyright 2015-2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import Button from "@atlaskit/button"; -import { HelperMessage } from "@atlaskit/form"; -import SectionMessage from "@atlaskit/section-message"; -import Spinner from "@atlaskit/spinner"; -import React, { Fragment, ReactNode } from "react"; -import { Logo } from "../../main/components/Logo"; -import AuthStyles from "./AuthStyles.module.css"; -import SSOButtons from "./elements/SSOButtons"; -import LoginHelper, { ISSOFlow, LoginFlow } from "./LoginHelper"; -import AutoDiscoveryUtils, { - ValidatedServerConfig, -} from "./util/AutoDiscoveryUtils"; -import { IMatrixClientCreds } from "./util/matrix"; -import { messageForResourceLimitError } from "./util/messages"; -import PasswordLogin from "./views/PasswordLogin"; - -interface IProps { - serverConfig: ValidatedServerConfig; - // If true, the component will consider itself busy. - busy?: boolean; - isSyncing?: boolean; - // Secondary HS which we try to log into if the user is using - // the default HS but login fails. Useful for migrating to a - // different homeserver without confusing users. - fallbackHsUrl?: string; - defaultDeviceDisplayName?: string; - pageAfterLogin?: string; - - // Called when the user has logged in. Params: - // - The object returned by the login API - // - The user's password, if applicable, (may be cached in memory for a - // short time so the user is not required to re-enter their password - // for operations like uploading cross-signing keys). - onLoggedIn(data: IMatrixClientCreds, password: string): void; - - // login shouldn't know or care how registration, password recovery, etc is done. - onRegisterClick(): void; - onForgotPasswordClick?(): void; - onServerConfigChange(config: ValidatedServerConfig): void; -} - -interface IState { - busy: boolean; - busyLoggingIn?: boolean; - errorText?: React.ReactNode; - loginIncorrect: boolean; - // can we attempt to log in or are there validation errors? - canTryLogin: boolean; - - flows?: LoginFlow[]; - - // used for preserving form values when changing homeserver - username: string; - phoneCountry?: string; - phoneNumber: string; - - // We perform liveliness checks later, but for now suppress the errors. - // We also track the server dead errors independently of the regular errors so - // that we can render it differently, and override any other error the user may - // be seeing. - serverIsAlive: boolean; - serverErrorIsFatal: boolean; - serverDeadError?: ReactNode; -} - -/* - * A wire component which glues together login UI components and Login logic - */ -export default class LoginComponent extends React.PureComponent< - IProps, - IState -> { - private unmounted = false; - private loginLogic: LoginHelper | undefined; - - private readonly stepRendererMap: Record ReactNode>; - - constructor(props: IProps) { - super(props); - - this.state = { - busy: false, - busyLoggingIn: undefined, - errorText: undefined, - loginIncorrect: false, - canTryLogin: true, - - flows: undefined, - - username: "", - phoneCountry: undefined, - phoneNumber: "", - - serverIsAlive: true, - serverErrorIsFatal: false, - serverDeadError: "", - }; - - // map from login step type to a function which will render a control - // letting you do that login type - this.stepRendererMap = { - "m.login.password": this.renderPasswordStep, - - // CAS and SSO are the same thing, modulo the url we link to - "m.login.cas": () => this.renderSsoStep("cas"), - "m.login.sso": () => this.renderSsoStep("sso"), - }; - } - - // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - // eslint-disable-next-line camelcase - UNSAFE_componentWillMount() { - this.initLoginLogic(this.props.serverConfig); - } - - componentWillUnmount() { - this.unmounted = true; - } - - // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - // eslint-disable-next-line camelcase - UNSAFE_componentWillReceiveProps(newProps: IProps) { - if ( - newProps.serverConfig.hsUrl === this.props.serverConfig.hsUrl && - newProps.serverConfig.isUrl === this.props.serverConfig.isUrl - ) - return; - - // Ensure that we end up actually logging in to the right place - this.initLoginLogic(newProps.serverConfig); - } - - isBusy = () => this.state.busy || this.props.busy; - - onPasswordLogin = async ( - username: string, - phoneCountry: string | undefined, - phoneNumber: string | undefined, - password: string - ) => { - if (!this.state.serverIsAlive) { - this.setState({ busy: true }); - // Do a quick liveliness check on the URLs - let aliveAgain = true; - try { - await AutoDiscoveryUtils.validateServerConfigWithStaticUrls( - this.props.serverConfig.hsUrl, - this.props.serverConfig.isUrl - ); - this.setState({ serverIsAlive: true, errorText: "" }); - } catch (e: any) { - const componentState = AutoDiscoveryUtils.authComponentStateForError(e); - this.setState({ - busy: false, - busyLoggingIn: false, - ...componentState, - }); - aliveAgain = !componentState.serverErrorIsFatal; - } - - // Prevent people from submitting their password when something isn't right. - if (!aliveAgain) { - return; - } - } - - this.setState({ - busy: true, - busyLoggingIn: true, - errorText: null, - loginIncorrect: false, - }); - - this.loginLogic!.loginViaPassword( - username, - phoneCountry, - phoneNumber, - password - ).then( - (data) => { - this.setState({ serverIsAlive: true }); // it must be, we logged in. - this.props.onLoggedIn(data, password); - }, - (error) => { - if (this.unmounted) { - return; - } - let errorText; - - // Some error strings only apply for logging in - const usingEmail = username.indexOf("@") > 0; - if (error.httpStatus === 400 && usingEmail) { - errorText = - "This homeserver does not support login using email address."; - } else if (error.errcode === "M_RESOURCE_LIMIT_EXCEEDED") { - const errorTop = messageForResourceLimitError(error.data.limit_type, { - monthly_active_user: - "This homeserver has hit its Monthly Active User limit.", - hs_blocked: - "This homeserver has been blocked by it's administrator.", - "": "This homeserver has exceeded one of its resource limits.", - }); - const errorDetail = messageForResourceLimitError( - error.data.limit_type, - { - "": "Please contact your service administrator to continue using this service.", // TODO: link to error.data.admin_contact - } - ); - errorText = ( -
-
{errorTop}
-
{errorDetail}
-
- ); - } else if (error.httpStatus === 401 || error.httpStatus === 403) { - if (error.errcode === "M_USER_DEACTIVATED") { - errorText = "This account has been deactivated."; - // } else if (SdkConfig.get()["disable_custom_urls"]) { - } else if (false) { - errorText = ( -
-
{"Incorrect username and/or password."}
-
- Please note you are logging into the{" "} - {this.props.serverConfig.hsName} server, not matrix.org. -
-
- ); - } else { - errorText = "Incorrect username and/or password."; - } - } else { - // other errors, not specific to doing a password login - errorText = this.errorTextFromError(error); - } - - this.setState({ - busy: false, - busyLoggingIn: false, - errorText: errorText, - // 401 would be the sensible status code for 'incorrect password' - // but the login API gives a 403 https://matrix.org/jira/browse/SYN-744 - // mentions this (although the bug is for UI auth which is not this) - // We treat both as an incorrect password - loginIncorrect: error.httpStatus === 401 || error.httpStatus === 403, - }); - } - ); - }; - - // TODO (maybe later): restore - // onUsernameBlur = async (username: string) => { - // const doWellknownLookup = username[0] === "@"; - // this.setState({ - // username: username, - // busy: doWellknownLookup, - // errorText: null, - // canTryLogin: true, - // }); - // if (doWellknownLookup) { - // const serverName = username.split(":").slice(1).join(":"); - // try { - // const result = await AutoDiscoveryUtils.validateServerName(serverName); - // this.props.onServerConfigChange(result); - // // We'd like to rely on new props coming in via `onServerConfigChange` - // // so that we know the servers have definitely updated before clearing - // // the busy state. In the case of a full MXID that resolves to the same - // // HS as Element's default HS though, there may not be any server change. - // // To avoid this trap, we clear busy here. For cases where the server - // // actually has changed, `initLoginLogic` will be called and manages - // // busy state for its own liveness check. - // this.setState({ - // busy: false, - // }); - // } catch (e) { - // console.error( - // "Problem parsing URL or unhandled error doing .well-known discovery:", - // e - // ); - - // let message = "Failed to perform homeserver discovery"; - // if (e.translatedMessage) { - // message = e.translatedMessage; - // } - - // let errorText: ReactNode = message; - // let discoveryState = {}; - // if (AutoDiscoveryUtils.isLivelinessError(e)) { - // errorText = this.state.errorText; - // discoveryState = AutoDiscoveryUtils.authComponentStateForError(e); - // } - - // this.setState({ - // busy: false, - // errorText, - // ...discoveryState, - // }); - // } - // } - // }; - - onRegisterClick = (ev: React.MouseEvent) => { - ev.preventDefault(); - ev.stopPropagation(); - this.props.onRegisterClick(); - }; - - onTryRegisterClick = (ev: React.MouseEvent) => { - const hasPasswordFlow = this.state.flows?.find( - (flow) => flow.type === "m.login.password" - ); - const ssoFlow = this.state.flows?.find( - (flow) => flow.type === "m.login.sso" || flow.type === "m.login.cas" - ); - // If has no password flow but an SSO flow guess that the user wants to register with SSO. - // TODO: instead hide the Register button if registration is disabled by checking with the server, - // has no specific errCode currently and uses M_FORBIDDEN. - if (ssoFlow && !hasPasswordFlow) { - ev.preventDefault(); - ev.stopPropagation(); - // TODO: restore for sso - // const ssoKind = ssoFlow.type === "m.login.sso" ? "sso" : "cas"; - // PlatformPeg.get().startSingleSignOn( - // this.loginLogic!.createTemporaryClient(), - // ssoKind, - // this.props.fragmentAfterLogin - // ); - throw new Error("sso not implemented"); - } else { - // Don't intercept - just go through to the register page - this.onRegisterClick(ev); - } - }; - - private async initLoginLogic({ hsUrl, isUrl }: ValidatedServerConfig) { - let isDefaultServer = false; - if ( - this.props.serverConfig.isDefault && - hsUrl === this.props.serverConfig.hsUrl && - isUrl === this.props.serverConfig.isUrl - ) { - isDefaultServer = true; - } - - const fallbackHsUrl = isDefaultServer - ? this.props.fallbackHsUrl - : undefined; - - const loginLogic = new LoginHelper(hsUrl, isUrl, fallbackHsUrl, { - defaultDeviceDisplayName: this.props.defaultDeviceDisplayName, - }); - this.loginLogic = loginLogic; - - this.setState({ - busy: true, - loginIncorrect: false, - }); - - // Do a quick liveliness check on the URLs - try { - const { warning } = - await AutoDiscoveryUtils.validateServerConfigWithStaticUrls( - hsUrl, - isUrl - ); - if (warning) { - this.setState({ - ...AutoDiscoveryUtils.authComponentStateForError(warning), - errorText: "", - }); - } else { - this.setState({ - serverIsAlive: true, - errorText: "", - }); - } - } catch (e: any) { - this.setState({ - busy: false, - ...AutoDiscoveryUtils.authComponentStateForError(e), - }); - } - - loginLogic - .getFlows() - .then( - (flows) => { - // look for a flow where we understand all of the steps. - const supportedFlows = flows.filter(this.isSupportedFlow); - - if (supportedFlows.length > 0) { - this.setState({ - flows: supportedFlows, - }); - return; - } - - // we got to the end of the list without finding a suitable flow. - this.setState({ - errorText: - "This homeserver doesn't offer any login flows which are supported by this client.", - }); - }, - (err) => { - this.setState({ - errorText: this.errorTextFromError(err), - loginIncorrect: false, - canTryLogin: false, - }); - } - ) - .finally(() => { - this.setState({ - busy: false, - }); - }); - } - - private isSupportedFlow = (flow: LoginFlow): boolean => { - // technically the flow can have multiple steps, but no one does this - // for login and loginLogic doesn't support it so we can ignore it. - if (!this.stepRendererMap[flow.type]) { - console.log( - "Skipping flow", - flow, - "due to unsupported login type", - flow.type - ); - return false; - } - return true; - }; - - private errorTextFromError(err: any): ReactNode { - let errCode = err.errcode; - if (!errCode && err.httpStatus) { - errCode = "HTTP " + err.httpStatus; - } - - let errorText: ReactNode = - "There was a problem communicating with the homeserver, " + - "please try again later." + - (errCode ? " (" + errCode + ")" : ""); - - if (err.cors === "rejected") { - if ( - window.location.protocol === "https:" && - (this.props.serverConfig.hsUrl.startsWith("http:") || - !this.props.serverConfig.hsUrl.startsWith("http")) - ) { - errorText = ( - - Can't connect to homeserver via HTTP when an HTTPS URL is in your - browser bar. Either use HTTPS or{" "} - - enable unsafe scripts - - - ); - } else { - errorText = ( - - Can't connect to homeserver - please check your connectivity, ensure - your - - homeserver's SSL certificate - {" "} - is trusted, and that a browser extension is not blocking requests. - - ); - } - } - - return errorText; - } - - renderLoginComponentForFlows() { - if (!this.state.flows) return null; - - // this is the ideal order we want to show the flows in - const order = ["m.login.password", "m.login.sso"]; - - const flows = order - .map((type) => this.state.flows!.find((flow) => flow.type === type)!) - .filter(Boolean); - return ( - - {flows.map((flow, i) => { - const stepRenderer = this.stepRendererMap[flow.type]; - return ( - - {i > 0 &&
OR
} - {stepRenderer()} -
- ); - })} -
- ); - } - - private renderPasswordStep = () => { - return ( - - ); - }; - - private renderSsoStep = (loginType: string) => { - const flow = this.state.flows!.find( - (flow) => flow.type === "m.login." + loginType - ) as ISSOFlow; - - return ( - flow.type === "m.login.password") - } - /> - ); - }; - - render() { - const loader = - this.isBusy() && !this.state.busyLoggingIn ? : null; - - const errorText = this.state.errorText; - - let errorTextSection; - if (errorText) { - errorTextSection = ( - -

{errorText}

-
- ); - } - - // let serverDeadSection; - // if (!this.state.serverIsAlive) { - // const classes = classNames({ - // mx_Login_error: true, - // mx_Login_serverError: true, - // mx_Login_serverErrorNonFatal: !this.state.serverErrorIsFatal, - // }); - // serverDeadSection = ( - //
{this.state.serverDeadError}
- // ); - // } - - let footer; - if (this.props.isSyncing || this.state.busyLoggingIn) { - footer = ( - - {/* TODO - {this.props.isSyncing ? "Syncing..." : "Signing In..."} */} - - ); - // } else if (SettingsStore.getValue(UIFeature.Registration)) { - } else { - footer = ( - <> - {this.props.onForgotPasswordClick && ( - <> - {" "} - •{" "} - - )} - - - ); - } - - // Renders the components that make up the login page - return ( -
-
-
- -
-
-
-
- {errorTextSection} - {loader} - {this.renderLoginComponentForFlows()} -
{footer}
-
-
-
- Powered by Matrix -
-
- ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/LoginHelper.ts b/packages/editor/src/app/matrix-auth/auth/LoginHelper.ts deleted file mode 100644 index d6fefeafe..000000000 --- a/packages/editor/src/app/matrix-auth/auth/LoginHelper.ts +++ /dev/null @@ -1,258 +0,0 @@ -// https://github.com/matrix-org/matrix-react-sdk/blob/develop/src/Login.ts -/* -Copyright 2015-2021 The Matrix.org Foundation C.I.C. -Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// @ts-ignore - XXX: tsc doesn't like this: our js-sdk imports are complex so this isn't surprising -import { createClient, MatrixClient } from "matrix-js-sdk"; -import { IMatrixClientCreds } from "./util/matrix"; -// import { IMatrixClientCreds } from "./MatrixClientPeg"; -// import SecurityCustomisations from "./customisations/Security"; - -interface ILoginOptions { - defaultDeviceDisplayName?: string; -} - -// TODO: Move this to JS SDK -interface IPasswordFlow { - type: "m.login.password"; -} - -export enum IdentityProviderBrand { - Gitlab = "gitlab", - Github = "github", - Apple = "apple", - Google = "google", - Facebook = "facebook", - Twitter = "twitter", -} - -export interface IIdentityProvider { - id: string; - name: string; - icon?: string; - brand?: IdentityProviderBrand | string; -} - -export interface ISSOFlow { - type: "m.login.sso" | "m.login.cas"; - identity_providers: IIdentityProvider[]; - // "org.matrix.msc2858.identity_providers": IIdentityProvider[]; // Unstable prefix for MSC2858 -} - -export type LoginFlow = ISSOFlow | IPasswordFlow; - -// TODO: Move this to JS SDK -/* eslint-disable camelcase */ -interface ILoginParams { - identifier?: object; - password?: string; - token?: string; - device_id?: string; - initial_device_display_name?: string; -} -/* eslint-enable camelcase */ - -export default class LoginHelper { - private hsUrl: string; - private isUrl: string; - private fallbackHsUrl?: string; - // TODO: Flows need a type in JS SDK - private flows: Array; - private defaultDeviceDisplayName?: string; - private tempClient: MatrixClient | null; - - constructor( - hsUrl: string, - isUrl: string, - fallbackHsUrl?: string, - opts?: ILoginOptions - ) { - this.hsUrl = hsUrl; - this.isUrl = isUrl; - this.fallbackHsUrl = fallbackHsUrl; - this.flows = []; - this.defaultDeviceDisplayName = opts?.defaultDeviceDisplayName; - this.tempClient = null; // memoize - } - - public getHomeserverUrl(): string { - return this.hsUrl; - } - - public getIdentityServerUrl(): string { - return this.isUrl; - } - - public setHomeserverUrl(hsUrl: string): void { - this.tempClient = null; // clear memoization - this.hsUrl = hsUrl; - } - - public setIdentityServerUrl(isUrl: string): void { - this.tempClient = null; // clear memoization - this.isUrl = isUrl; - } - - /** - * Get a temporary MatrixClient, which can be used for login or register - * requests. - * @returns {MatrixClient} - */ - public createTemporaryClient(): MatrixClient { - if (this.tempClient) return this.tempClient; // use memoization - return (this.tempClient = createClient({ - baseUrl: this.hsUrl, - idBaseUrl: this.isUrl, - })); - } - - public async getFlows(): Promise> { - const client = this.createTemporaryClient(); - const { flows } = await client.loginFlows(); - this.flows = flows; - return this.flows; - } - - public loginViaPassword( - username: string, - phoneCountry: string | undefined, - phoneNumber: string | undefined, - password: string - ): Promise { - const isEmail = username.indexOf("@") > 0; - - let identifier; - if (phoneCountry && phoneNumber) { - identifier = { - type: "m.id.phone", - country: phoneCountry, - phone: phoneNumber, - // XXX: Synapse historically wanted `number` and not `phone` - number: phoneNumber, - }; - } else if (isEmail) { - identifier = { - type: "m.id.thirdparty", - medium: "email", - address: username, - }; - } else { - identifier = { - type: "m.id.user", - user: username, - }; - } - - const loginParams = { - password, - identifier, - initial_device_display_name: this.defaultDeviceDisplayName, - }; - - const tryFallbackHs = (originalError: Error) => { - if (!this.fallbackHsUrl) { - throw originalError; - } - return sendLoginRequest( - this.fallbackHsUrl, - this.isUrl, - "m.login.password", - loginParams - ).catch((fallbackError) => { - console.log("fallback HS login failed", fallbackError); - // throw the original error - throw originalError; - }); - }; - - let originalLoginError = null; - return sendLoginRequest( - this.hsUrl, - this.isUrl, - "m.login.password", - loginParams - ) - .catch((error) => { - originalLoginError = error; - if (error.httpStatus === 403) { - if (this.fallbackHsUrl) { - return tryFallbackHs(originalLoginError); - } - } - throw originalLoginError; - }) - .catch((error) => { - console.log("Login failed", error); - throw error; - }); - } -} - -/** - * Send a login request to the given server, and format the response - * as a MatrixClientCreds - * - * @param {string} hsUrl the base url of the Homeserver used to log in. - * @param {string} isUrl the base url of the default identity server - * @param {string} loginType the type of login to do - * @param {ILoginParams} loginParams the parameters for the login - * - * @returns {MatrixClientCreds} - */ -export async function sendLoginRequest( - hsUrl: string, - isUrl: string | undefined, - loginType: string, - loginParams: ILoginParams -): Promise { - const client = createClient({ - baseUrl: hsUrl, - idBaseUrl: isUrl, - }); - - const data = await client.login(loginType, loginParams); - - const wellknown = data.well_known; - if (wellknown) { - if (wellknown["m.homeserver"] && wellknown["m.homeserver"]["base_url"]) { - hsUrl = wellknown["m.homeserver"]["base_url"]; - console.log( - `Overrode homeserver setting with ${hsUrl} from login response` - ); - } - if ( - wellknown["m.identity_server"] && - wellknown["m.identity_server"]["base_url"] - ) { - // TODO: should we prompt here? - isUrl = wellknown["m.identity_server"]["base_url"]; - console.log(`Overrode IS setting with ${isUrl} from login response`); - } - } - - const creds: IMatrixClientCreds = { - homeserverUrl: hsUrl, - identityServerUrl: isUrl, - userId: data.user_id, - deviceId: data.device_id, - accessToken: data.access_token, - }; - - // SecurityCustomisations.examineLoginResponse?.(data, creds); - - return creds; -} diff --git a/packages/editor/src/app/matrix-auth/auth/Registration.module.css b/packages/editor/src/app/matrix-auth/auth/Registration.module.css deleted file mode 100644 index a983083f2..000000000 --- a/packages/editor/src/app/matrix-auth/auth/Registration.module.css +++ /dev/null @@ -1,19 +0,0 @@ -.SignIn { - position: absolute; - display: inline-block; - width: 42%; - height: 32px; - bottom: 16px; - right: 16px; - text-align: left; -} - -.SignInText { - position: absolute; - padding: 4px 0 0 0; -} - -.SignInButton { - position: absolute; - right: 0px; -} diff --git a/packages/editor/src/app/matrix-auth/auth/Registration.tsx b/packages/editor/src/app/matrix-auth/auth/Registration.tsx deleted file mode 100644 index 81cb22ec4..000000000 --- a/packages/editor/src/app/matrix-auth/auth/Registration.tsx +++ /dev/null @@ -1,691 +0,0 @@ -/* -Copyright 2015-2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import Button from "@atlaskit/button"; -import { HelperMessage } from "@atlaskit/form"; -import SectionMessage from "@atlaskit/section-message"; -import classNames from "classnames"; -import { createClient, MatrixClient } from "matrix-js-sdk"; -import React, { ReactNode } from "react"; -import { Logo } from "../../main/components/Logo"; -import { getStoredSessionOwner } from "../AuthStoreUtil"; -import { MatrixClientPeg } from "../MatrixClientPeg"; -import AuthStyles from "./AuthStyles.module.css"; -import Spinner from "./elements/Spinner"; -import SSOButtons from "./elements/SSOButtons"; -import InteractiveAuth from "./InteractiveAuth"; -import Login, { ISSOFlow } from "./LoginHelper"; -import AutoDiscoveryUtils, { - ValidatedServerConfig, -} from "./util/AutoDiscoveryUtils"; -import { messageForResourceLimitError } from "./util/messages"; -import RegistrationForm from "./views/RegistrationForm"; - -interface IProps { - serverConfig: ValidatedServerConfig; - defaultDeviceDisplayName: string; - email?: string; - brand?: string; - clientSecret?: string; - sessionId?: string; - idSid?: string; - pageAfterLogin?: string; - - // Called when the user has logged in. Params: - // - object with userId, deviceId, homeserverUrl, identityServerUrl, accessToken - // - The user's password, if available and applicable (may be cached in memory - // for a short time so the user is not required to re-enter their password - // for operations like uploading cross-signing keys). - onLoggedIn( - params: { - userId: string; - deviceId: string; - homeserverUrl: string; - identityServerUrl: string; - accessToken: string; - }, - password: string - ): void; - makeRegistrationUrl(params: { - /* eslint-disable camelcase */ - client_secret: string; - hs_url: string; - is_url?: string; - session_id: string; - /* eslint-enable camelcase */ - }): string; - // registration shouldn't know or care how login is done. - onLoginClick(): void; - onServerConfigChange(config: ValidatedServerConfig): void; -} - -interface IState { - busy: boolean; - errorText?: string; - // true if we're waiting for the user to complete - // We remember the values entered by the user because - // the registration form will be unmounted during the - // course of registration, but if there's an error we - // want to bring back the registration form with the - // values the user entered still in it. We can keep - // them in this component's state since this component - // persist for the duration of the registration process. - formVals: Record; - // user-interactive auth - // If we've been given a session ID, we're resuming - // straight back into UI auth - doingUIAuth: boolean; - // If set, we've registered but are not going to log - // the user in to their new account automatically. - completedNoSignin: boolean; - flows?: { - stages: string[]; - }[]; - // We perform liveliness checks later, but for now suppress the errors. - // We also track the server dead errors independently of the regular errors so - // that we can render it differently, and override any other error the user may - // be seeing. - serverIsAlive: boolean; - serverErrorIsFatal: boolean; - serverDeadError?: ReactNode; - - // Our matrix client - part of state because we can't render the UI auth - // component without it. - matrixClient?: MatrixClient; - // The user ID we've just registered - registeredUsername?: string; - // if a different user ID to the one we just registered is logged in, - // this is the user ID that's logged in. - differentLoggedInUserId?: string; - // the SSO flow definition, this is fetched from /login as that's the only - // place it is exposed. - ssoFlow?: ISSOFlow; -} - -export default class Registration extends React.Component { - loginLogic: Login; - - constructor(props: IProps) { - super(props); - - this.state = { - busy: false, - errorText: undefined, - formVals: this.props.email - ? { - email: this.props.email, - } - : {}, - doingUIAuth: Boolean(this.props.sessionId), - flows: undefined, - completedNoSignin: false, - serverIsAlive: true, - serverErrorIsFatal: false, - serverDeadError: "", - }; - - const { hsUrl, isUrl } = this.props.serverConfig; - this.loginLogic = new Login(hsUrl, isUrl, undefined, { - defaultDeviceDisplayName: "Element login check", // We shouldn't ever be used - }); - } - - componentDidMount() { - this.replaceClient(this.props.serverConfig); - } - - // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - // eslint-disable-next-line camelcase - UNSAFE_componentWillReceiveProps(newProps: IProps) { - if ( - newProps.serverConfig.hsUrl === this.props.serverConfig.hsUrl && - newProps.serverConfig.isUrl === this.props.serverConfig.isUrl - ) - return; - - this.replaceClient(newProps.serverConfig); - } - - private async replaceClient(serverConfig: ValidatedServerConfig) { - this.setState({ - errorText: undefined, - serverDeadError: null, - serverErrorIsFatal: false, - // busy while we do liveness check (we need to avoid trying to render - // the UI auth component while we don't have a matrix client) - busy: true, - }); - - // Do a liveliness check on the URLs - try { - await AutoDiscoveryUtils.validateServerConfigWithStaticUrls( - serverConfig.hsUrl, - serverConfig.isUrl - ); - this.setState({ - serverIsAlive: true, - serverErrorIsFatal: false, - }); - } catch (e: any) { - this.setState({ - busy: false, - ...AutoDiscoveryUtils.authComponentStateForError(e, "register"), - }); - if (this.state.serverErrorIsFatal) { - return; // Server is dead - do not continue. - } - } - - const { hsUrl, isUrl } = serverConfig; - const cli = createClient({ - baseUrl: hsUrl, - idBaseUrl: isUrl, - }); - - this.loginLogic.setHomeserverUrl(hsUrl); - this.loginLogic.setIdentityServerUrl(isUrl); - - let ssoFlow: ISSOFlow | undefined; - try { - const loginFlows = await this.loginLogic.getFlows(); - ssoFlow = loginFlows.find( - (f) => f.type === "m.login.sso" || f.type === "m.login.cas" - ) as ISSOFlow; - } catch (e) { - console.error("Failed to get login flows to check for SSO support", e); - } - - this.setState({ - matrixClient: cli, - ssoFlow, - busy: false, - }); - const showGenericError = (e: any) => { - this.setState({ - errorText: "Unable to query for supported registration methods.", - // add empty flows array to get rid of spinner - flows: [], - }); - }; - try { - // We do the first registration request ourselves to discover whether we need to - // do SSO instead. If we've already started the UI Auth process though, we don't - // need to. - if (!this.state.doingUIAuth) { - await this.makeRegisterRequest(cli, null); - // This should never succeed since we specified no auth object. - console.log("Expecting 401 from register request but got success!"); - } - } catch (e: any) { - if (e.httpStatus === 401) { - this.setState({ - flows: e.data.flows, - }); - } else if (e.httpStatus === 403 && e.errcode === "M_UNKNOWN") { - // At this point registration is pretty much disabled, but before we do that let's - // quickly check to see if the server supports SSO instead. If it does, we'll send - // the user off to the login page to figure their account out. - if (ssoFlow) { - // Redirect to login page - server probably expects SSO only - // dis.dispatch({ action: "start_login" }); - // TODO SSO - } else { - this.setState({ - serverErrorIsFatal: true, // fatal because user cannot continue on this server - errorText: "Registration has been disabled on this homeserver.", - // add empty flows array to get rid of spinner - flows: [], - }); - } - } else { - console.log("Unable to query for supported registration methods.", e); - showGenericError(e); - } - } - } - - private onFormSubmit = async (formVals: { - username: string; - password: string; - email?: string; - phoneCountry?: string; - phoneNumber?: string; - }) => { - this.setState({ - errorText: "", - busy: true, - formVals: formVals, - doingUIAuth: true, - }); - }; - - private requestEmailToken = ( - emailAddress: string, - clientSecret: string, - sendAttempt: any, - sessionId: any - ) => { - return this.state.matrixClient!.requestRegisterEmailToken( - emailAddress, - clientSecret, - sendAttempt, - this.props.makeRegistrationUrl({ - client_secret: clientSecret, - hs_url: this.state.matrixClient!.getHomeserverUrl(), - is_url: this.state.matrixClient!.getIdentityServerUrl(), - session_id: sessionId, - }) - ); - }; - - private onUIAuthFinished = async ( - success: boolean, - response: any, - extra: any - ) => { - if (!success) { - let msg = response.message || response.toString(); - // can we give a better error message? - if (response.errcode === "M_RESOURCE_LIMIT_EXCEEDED") { - const errorTop = messageForResourceLimitError( - response.data.limit_type, - { - monthly_active_user: - "This homeserver has hit its Monthly Active User limit.", - hs_blocked: - "This homeserver has been blocked by it's administrator.", - "": "This homeserver has exceeded one of its resource limits.", - } - ); - const errorDetail = messageForResourceLimitError( - response.data.limit_type, - { - "": "Please contact your service administrator to continue using this service.", - } - ); - msg = ( -
-

{errorTop}

-

{errorDetail}

-
- ); - } else if ( - response.required_stages && - response.required_stages.indexOf("m.login.msisdn") > -1 - ) { - let msisdnAvailable = false; - for (const flow of response.available_flows) { - msisdnAvailable = - msisdnAvailable || flow.stages.includes("m.login.msisdn"); - } - if (!msisdnAvailable) { - msg = - "This server does not support authentication with a phone number."; - } - } else if (response.errcode === "M_USER_IN_USE") { - msg = "That username already exists, please try another."; - } - this.setState({ - busy: false, - doingUIAuth: false, - errorText: msg, - }); - return; - } - - MatrixClientPeg.setJustRegisteredUserId(response.user_id); - - const newState = { - doingUIAuth: false, - registeredUsername: response.user_id, - differentLoggedInUserId: undefined as string | undefined, - completedNoSignin: false, - // we're still busy until we get unmounted: don't show the registration form again - busy: true, - }; - - // The user came in through an email validation link. To avoid overwriting - // their session, check to make sure the session isn't someone else, and - // isn't a guest user since we'll usually have set a guest user session before - // starting the registration process. This isn't perfect since it's possible - // the user had a separate guest session they didn't actually mean to replace. - const [sessionOwner, sessionIsGuest] = (await getStoredSessionOwner()) || [ - undefined, - undefined, - ]; - if (sessionOwner && !sessionIsGuest && sessionOwner !== response.userId) { - console.log( - `Found a session for ${sessionOwner} but ${response.userId} has just registered.` - ); - newState.differentLoggedInUserId = sessionOwner; - } - - if (response.access_token) { - await this.props.onLoggedIn( - { - userId: response.user_id, - deviceId: response.device_id, - homeserverUrl: this.state.matrixClient!.getHomeserverUrl(), - identityServerUrl: this.state.matrixClient!.getIdentityServerUrl(), - accessToken: response.access_token, - }, - this.state.formVals.password - ); - - this.setupPushers(); - } else { - newState.busy = false; - newState.completedNoSignin = true; - } - - this.setState(newState); - }; - - private setupPushers() { - if (!this.props.brand) { - return Promise.resolve(); - } - const matrixClient = MatrixClientPeg.get(); - return matrixClient.getPushers().then( - (resp: any) => { - const pushers = resp.pushers; - for (let i = 0; i < pushers.length; ++i) { - if (pushers[i].kind === "email") { - const emailPusher = pushers[i]; - emailPusher.data = { brand: this.props.brand }; - matrixClient.setPusher(emailPusher).then( - () => { - console.log("Set email branding to " + this.props.brand); - }, - (error: any) => { - console.error("Couldn't set email branding: " + error); - } - ); - } - } - }, - (error: any) => { - console.error("Couldn't get pushers: " + error); - } - ); - } - - private onLoginClick = (ev: React.MouseEvent) => { - ev.preventDefault(); - ev.stopPropagation(); - this.props.onLoginClick(); - }; - - private onGoToFormClicked = (ev: React.MouseEvent) => { - ev.preventDefault(); - ev.stopPropagation(); - this.replaceClient(this.props.serverConfig); - this.setState({ - busy: false, - doingUIAuth: false, - }); - }; - - private makeRegisterRequest = (matrixClient: MatrixClient, auth: any) => { - // We inhibit login if we're trying to register with an email address: this - // avoids a lot of complex race conditions that can occur if we try to log - // the user in one one or both of the tabs they might end up with after - // clicking the email link. - let inhibitLogin: boolean | undefined = Boolean(this.state.formVals.email); - - // Only send inhibitLogin if we're sending username / pw params - // (Since we need to send no params at all to use the ones saved in the - // session). - if (!this.state.formVals.password) inhibitLogin = undefined; - - const registerParams = { - username: this.state.formVals.username, - password: this.state.formVals.password, - initial_device_display_name: this.props.defaultDeviceDisplayName, - auth: undefined, - inhibit_login: undefined as boolean | undefined, - }; - if (auth) registerParams.auth = auth; - if (inhibitLogin !== undefined && inhibitLogin !== null) - registerParams.inhibit_login = inhibitLogin; - return matrixClient.registerRequest(registerParams); - }; - - private getUIAuthInputs() { - return { - emailAddress: this.state.formVals.email, - phoneCountry: this.state.formVals.phoneCountry, - phoneNumber: this.state.formVals.phoneNumber, - }; - } - - // Links to the login page shown after registration is completed are routed through this - // which checks the user hasn't already logged in somewhere else (perhaps we should do - // this more generally?) - // private onLoginClickWithCheck = async (ev?: ButtonEvent) => { - // ev?.preventDefault(); - - // const sessionLoaded = await loadSession({ ignoreGuest: true }); - // if (!sessionLoaded) { - // // ok fine, there's still no session: really go to the login page - // this.props.onLoginClick(); - // } - - // return sessionLoaded; - // }; - - private renderRegisterComponent() { - if (this.state.matrixClient && this.state.doingUIAuth) { - return ( - - this.makeRegisterRequest(this.state.matrixClient!, params) - } - onAuthFinished={this.onUIAuthFinished} - inputs={this.getUIAuthInputs()} - requestEmailToken={this.requestEmailToken} - sessionId={this.props.sessionId} - clientSecret={this.props.clientSecret} - emailSid={this.props.idSid} - poll={true} - /> - ); - } else if (!this.state.matrixClient && !this.state.busy) { - return null; - } else if (this.state.busy || !this.state.flows) { - return ( -
- -
- ); - } else if (this.state.flows.length) { - let ssoSection; - if (this.state.ssoFlow) { - // i18n: ssoButtons & usernamePassword are placeholders to help translators understand context - ssoSection = ( - -
Or
- -
- ); - } - - return ( - - - {ssoSection} - - ); - } - } - - render() { - let errorTextSection; - const errorText = this.state.errorText; - if (errorText) { - errorTextSection = ( -
- -

{errorText}

-
-
- ); - } - - let serverDeadSection; - if (!this.state.serverIsAlive) { - const classes = classNames({ - mx_Login_error: true, - mx_Login_serverError: true, - mx_Login_serverErrorNonFatal: !this.state.serverErrorIsFatal, - }); - serverDeadSection = ( -
{this.state.serverDeadError}
- ); - } - - // Only show the 'go back' button if you're not looking at the form - let goBack; - if (this.state.doingUIAuth) { - goBack = ( - // eslint-disable-next-line jsx-a11y/anchor-is-valid - - Go back - - ); - } - - let body; - if (this.state.completedNoSignin) { - let regDoneText; - if (this.state.differentLoggedInUserId) { - regDoneText = ( -
-

- Your new account ({this.state.registeredUsername}) is registered, - but you're already logged into a different account ( - {this.state.differentLoggedInUserId}). -

-

- -

-
- ); - } else if (this.state.formVals.password) { - // We're the client that started the registration - regDoneText = ( -

- - Log in - {" "} - to your new account. -

- ); - } else { - // We're not the original client: the user probably got to us by clicking the - // email validation link. We can't offer a 'go straight to your account' link - // as we don't have the original creds. - regDoneText = ( -

- You can now close this window or{" "} - - log in - {" "} - to your new account. -

- ); - } - body = ( -
-

Registration Successful

- {regDoneText} -
- ); - } else { - body = ( - <> - {/* Create account */} - {serverDeadSection} - {/* */} - {this.renderRegisterComponent()} - {goBack} -
- -
- - ); - } - - // Renders the components that make up the registration page - return ( -
-
-
- -
-
-
-
- {errorTextSection} - {body} -
-
-
- Powered by Matrix -
-
- ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/elements/AccessibleButton.tsx b/packages/editor/src/app/matrix-auth/auth/elements/AccessibleButton.tsx deleted file mode 100644 index e245645aa..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/AccessibleButton.tsx +++ /dev/null @@ -1,121 +0,0 @@ -/* - Copyright 2016 Jani Mustonen - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - */ - -import React from "react"; - -import classnames from "classnames"; - -export type ButtonEvent = - | React.MouseEvent - | React.KeyboardEvent; - -/** - * children: React's magic prop. Represents all children given to the element. - * element: (optional) The base element type. "div" by default. - * onClick: (required) Event handler for button activation. Should be - * implemented exactly like a normal onClick handler. - */ -interface IProps extends React.InputHTMLAttributes { - inputRef?: React.Ref; - // element?: "input"; - // The kind of button, similar to how Bootstrap works. - // See available classes for AccessibleButton for options. - kind?: string; - // The ARIA role - role?: string; - // The tabIndex - tabIndex?: number; - disabled?: boolean; - className?: string; - onClick(e?: ButtonEvent): void; -} - -interface IAccessibleButtonProps extends React.InputHTMLAttributes { - ref?: React.Ref; -} - -/** - * AccessibleButton is a generic wrapper for any element that should be treated - * as a button. Identifies the element as a button, setting proper tab - * indexing and keyboard activation behavior. - * - * @param {Object} props react element properties - * @returns {Object} rendered react - */ -export default function AccessibleButton({ - // element, - onClick, - children, - kind, - disabled, - inputRef, - className, - ...restProps -}: IProps) { - const newProps: IAccessibleButtonProps = restProps; - if (!disabled) { - newProps.onClick = onClick; - // We need to consume enter onKeyDown and space onKeyUp - // otherwise we are risking also activating other keyboard focusable elements - // that might receive focus as a result of the AccessibleButtonClick action - // It's because we are using html buttons at a few places e.g. inside dialogs - // And divs which we report as role button to assistive technologies. - // Browsers handle space and enter keypresses differently and we are only adjusting to the - // inconsistencies here - newProps.onKeyDown = (e) => { - if (e.key === "Enter") { - e.stopPropagation(); - e.preventDefault(); - return onClick(e); - } - if (e.key === " ") { - e.stopPropagation(); - e.preventDefault(); - } - }; - newProps.onKeyUp = (e) => { - if (e.key === " ") { - e.stopPropagation(); - e.preventDefault(); - return onClick(e); - } - if (e.key === "Enter") { - e.stopPropagation(); - e.preventDefault(); - } - }; - } - - // Pass through the ref - used for keyboard shortcut access to some buttons - newProps.ref = inputRef; - - newProps.className = classnames("mx_AccessibleButton", className, { - mx_AccessibleButton_hasKind: kind, - [`mx_AccessibleButton_kind_${kind}`]: kind, - mx_AccessibleButton_disabled: disabled, - }); - - // React.createElement expects InputHTMLAttributes - return React.createElement("input", restProps, children); -} - -AccessibleButton.defaultProps = { - element: "div", - role: "button", - tabIndex: 0, -}; - -AccessibleButton.displayName = "AccessibleButton"; diff --git a/packages/editor/src/app/matrix-auth/auth/elements/Dropdown.tsx.bak b/packages/editor/src/app/matrix-auth/auth/elements/Dropdown.tsx.bak deleted file mode 100644 index 7f2317eb7..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/Dropdown.tsx.bak +++ /dev/null @@ -1,410 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd -Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { createRef } from "react"; -import PropTypes from "prop-types"; -import classnames from "classnames"; -import AccessibleButton from "./AccessibleButton"; - -type Props = { - id: string; - // The width that the dropdown should be. If specified, - // the dropped-down part of the menu will be set to this - // width. - menuWidth: number; - // Called when the selected option changes - onOptionChange: PropTypes.func.isRequired; - // Called when the value of the search field changes - onSearchChange: PropTypes.func; - searchEnabled: boolean; - // Function that, given the key of an option, returns - // a node representing that option to be displayed in the - // box itself as the currently-selected option (ie. as - // opposed to in the actual dropped-down part). If - // unspecified, the appropriate child element is used as - // in the dropped-down menu. - getShortOption: PropTypes.func; - value: string; - // negative for consistency with HTML - disabled: boolean; - // ARIA label - label: string; -}; - -class MenuOption extends React.Component { - constructor(props: Props) { - super(props); - this._onMouseEnter = this._onMouseEnter.bind(this); - this._onClick = this._onClick.bind(this); - } - - static defaultProps = { - disabled: false, - }; - - _onMouseEnter() { - this.props.onMouseEnter(this.props.dropdownKey); - } - - _onClick(e) { - e.preventDefault(); - e.stopPropagation(); - this.props.onClick(this.props.dropdownKey); - } - - render() { - const optClasses = classnames({ - mx_Dropdown_option: true, - mx_Dropdown_option_highlight: this.props.highlighted, - }); - - return ( -
- {this.props.children} -
- ); - } -} - -MenuOption.propTypes = { - children: PropTypes.oneOfType([ - PropTypes.arrayOf(PropTypes.node), - PropTypes.node, - ]), - highlighted: PropTypes.bool, - dropdownKey: PropTypes.string, - onClick: PropTypes.func.isRequired, - onMouseEnter: PropTypes.func.isRequired, - inputRef: PropTypes.any, -}; - -/* - * Reusable dropdown select control, akin to react-select, - * but somewhat simpler as react-select is 79KB of minified - * javascript. - * - * TODO: Port NetworkDropdown to use this. - */ -export default class Dropdown extends React.Component { - constructor(props) { - super(props); - - this.dropdownRootElement = null; - this.ignoreEvent = null; - - this._onInputClick = this._onInputClick.bind(this); - this._onRootClick = this._onRootClick.bind(this); - this._onDocumentClick = this._onDocumentClick.bind(this); - this._onMenuOptionClick = this._onMenuOptionClick.bind(this); - this._onInputChange = this._onInputChange.bind(this); - this._collectRoot = this._collectRoot.bind(this); - this._collectInputTextBox = this._collectInputTextBox.bind(this); - this._setHighlightedOption = this._setHighlightedOption.bind(this); - - this.inputTextBox = null; - - this._reindexChildren(this.props.children); - - const firstChild = React.Children.toArray(props.children)[0]; - - this.state = { - // True if the menu is dropped-down - expanded: false, - // The key of the highlighted option - // (the option that would become selected if you pressed enter) - highlightedOption: firstChild ? firstChild.key : null, - // the current search query - searchQuery: "", - }; - } - - // TODO: [REACT-WARNING] Replace component with real class, use constructor for refs - UNSAFE_componentWillMount() { - // eslint-disable-line camelcase - this._button = createRef(); - // Listen for all clicks on the document so we can close the - // menu when the user clicks somewhere else - document.addEventListener("click", this._onDocumentClick, false); - } - - componentWillUnmount() { - document.removeEventListener("click", this._onDocumentClick, false); - } - - // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - UNSAFE_componentWillReceiveProps(nextProps) { - // eslint-disable-line camelcase - if (!nextProps.children || nextProps.children.length === 0) { - return; - } - this._reindexChildren(nextProps.children); - const firstChild = nextProps.children[0]; - this.setState({ - highlightedOption: firstChild ? firstChild.key : null, - }); - } - - _reindexChildren(children) { - this.childrenByKey = {}; - React.Children.forEach(children, (child) => { - this.childrenByKey[child.key] = child; - }); - } - - _onDocumentClick(ev) { - // Close the dropdown if the user clicks anywhere that isn't - // within our root element - if (ev !== this.ignoreEvent) { - this.setState({ - expanded: false, - }); - } - } - - _onRootClick(ev) { - // This captures any clicks that happen within our elements, - // such that we can then ignore them when they're seen by the - // click listener on the document handler, ie. not close the - // dropdown immediately after opening it. - // NB. We can't just stopPropagation() because then the event - // doesn't reach the React onClick(). - this.ignoreEvent = ev; - } - - _onInputClick(ev) { - if (this.props.disabled) return; - - if (!this.state.expanded) { - this.setState({ - expanded: true, - }); - ev.preventDefault(); - } - } - - _close() { - this.setState({ - expanded: false, - }); - // their focus was on the input, its getting unmounted, move it to the button - if (this._button.current) { - this._button.current.focus(); - } - } - - _onMenuOptionClick(dropdownKey) { - this._close(); - this.props.onOptionChange(dropdownKey); - } - - _onInputKeyDown = (e) => { - let handled = true; - - // These keys don't generate keypress events and so needs to be on keyup - switch (e.key) { - case Key.ENTER: - this.props.onOptionChange(this.state.highlightedOption); - // fallthrough - case Key.ESCAPE: - this._close(); - break; - case Key.ARROW_DOWN: - this.setState({ - highlightedOption: this._nextOption(this.state.highlightedOption), - }); - break; - case Key.ARROW_UP: - this.setState({ - highlightedOption: this._prevOption(this.state.highlightedOption), - }); - break; - default: - handled = false; - } - - if (handled) { - e.preventDefault(); - e.stopPropagation(); - } - }; - - _onInputChange(e) { - this.setState({ - searchQuery: e.target.value, - }); - if (this.props.onSearchChange) { - this.props.onSearchChange(e.target.value); - } - } - - _collectRoot(e) { - if (this.dropdownRootElement) { - this.dropdownRootElement.removeEventListener( - "click", - this._onRootClick, - false - ); - } - if (e) { - e.addEventListener("click", this._onRootClick, false); - } - this.dropdownRootElement = e; - } - - _collectInputTextBox(e) { - this.inputTextBox = e; - if (e) e.focus(); - } - - _setHighlightedOption(optionKey) { - this.setState({ - highlightedOption: optionKey, - }); - } - - _nextOption(optionKey) { - const keys = Object.keys(this.childrenByKey); - const index = keys.indexOf(optionKey); - return keys[(index + 1) % keys.length]; - } - - _prevOption(optionKey) { - const keys = Object.keys(this.childrenByKey); - const index = keys.indexOf(optionKey); - return keys[(index - 1) % keys.length]; - } - - _scrollIntoView(node) { - if (node) { - node.scrollIntoView({ - block: "nearest", - behavior: "auto", - }); - } - } - - _getMenuOptions() { - const options = React.Children.map(this.props.children, (child) => { - const highlighted = this.state.highlightedOption === child.key; - return ( - - {child} - - ); - }); - if (options.length === 0) { - return [ -
- {_t("No results")} -
, - ]; - } - return options; - } - - render() { - let currentValue; - - const menuStyle = {}; - if (this.props.menuWidth) menuStyle.width = this.props.menuWidth; - - let menu; - if (this.state.expanded) { - if (this.props.searchEnabled) { - currentValue = ( - - ); - } - menu = ( -
- {this._getMenuOptions()} -
- ); - } - - if (!currentValue) { - const selectedChild = this.props.getShortOption - ? this.props.getShortOption(this.props.value) - : this.childrenByKey[this.props.value]; - currentValue = ( -
- {selectedChild} -
- ); - } - - const dropdownClasses = { - mx_Dropdown: true, - mx_Dropdown_disabled: this.props.disabled, - }; - if (this.props.className) { - dropdownClasses[this.props.className] = true; - } - - // Note the menu sits inside the AccessibleButton div so it's anchored - // to the input, but overflows below it. The root contains both. - return ( -
- - {currentValue} - - {menu} - -
- ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/elements/Field.tsx b/packages/editor/src/app/matrix-auth/auth/elements/Field.tsx deleted file mode 100644 index 27958fc70..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/Field.tsx +++ /dev/null @@ -1,253 +0,0 @@ -/* -Copyright 2019 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { - Fragment, - InputHTMLAttributes, - SelectHTMLAttributes, - TextareaHTMLAttributes, -} from "react"; -import TextField from "@atlaskit/textfield"; -import { - ErrorMessage, - Field as AtlaskitField, - ValidMessage, -} from "@atlaskit/form"; -import Select, { OptionType } from "@atlaskit/select"; -import { SuccessProgressBar } from "@atlaskit/progress-bar"; - -const BASE_ID = "mx_Field"; -let count = 1; -function getId() { - return `${BASE_ID}_${count++}`; -} - -interface IProps { - // The field's key, which Atlaskit uses in the Form state in the key-value per Field. - key?: string; - // The field's ID, which binds the input and label together. Immutable. - id?: string; - // The field's type (when used as an ). Defaults to "text". - type?: string; - // id of a element for suggestions - list?: string; - // The field's label string. - label?: string; - // The field's placeholder string. Defaults to the label. - placeholder?: string; - // The callback called whenever the contents of the field - // changes. Returns an object with `valid` boolean field - // and a `feedback` react component field to provide feedback - // The callback function takes the field value and should return - // an "error" if it is not valid, or undefined if it is valid. - // If ShowErrorMsg is set in the corresponding Field, the error string - // will be displayed when the field is invalid. Similarly, if ShowValidMsg - // is set in the corresponding Field, a validation message will be displayed - // if the field is valid. The valid message is also set in the Field props. - // Additionally, if a "progress"(range 0-1) is returned with the "error", - // a progress bar will be rendered under the field. - // to the user. - onValidate?: (value?: T) => IValidationResult | Promise; - // A validity check for empty field, Atlaskit will auto focus and - // show tooltip on submission - isRequired?: boolean; - // Whether Atlaskit should render a ValidMessage when validation passes - // The message should be passed to validMessage prop - showValidMsg?: true | false | "if-not-empty"; - // Whether Atlaskit should render a ErrorMessage when validation fails - // The message should be returned by the validate function - showErrorMsg?: boolean; - // The HelperMessage message, if provided, that Atlaskit will show under the field. - helperMessage?: string; - // The ValidMessage that is rendered if field is valid and showValidMsg is true. - validMessage?: string; - // All other props pass through to the . - defaultValue?: T; -} - -export interface IValidationResult { - error?: string; - progress?: number; -} - -export interface IInputProps - extends IProps, - Omit, "defaultValue" | "type"> { - // The element to create. Defaults to "input". - element?: "input"; -} - -// TODO: consider removing SelectHTMLAttributes extension and use custom props -interface ISelectProps - extends IProps, - Omit, "defaultValue" | "type"> { - // To define options for a select, use - element: "select"; - options?: OptionType[]; - // onChange?: -} - -interface ITextareaProps - extends IProps, - Omit, "defaultValue"> { - element: "textarea"; -} - -interface IState { - error?: string; - progress?: number; -} - -type Props = - | IInputProps - | ITextareaProps - | ISelectProps; - -// Field renders an appropriate Atlaskit Field based on the given props. -// -// Input and Select are the two available field types, and Textarea could be -// implemented when needed(current codebase does not make use of it, Matrix did). -// -// Field events, including submission, will trigger Atlaskits validation call, -// which in turn calls the onValidate function provided to this component. More -// sophisticated rendering of validity that Atlaskit does on each field can be -// set by props. for more information regarding props see comments on each prop, -// as well as Atlaskit documentation for more detauls on how Fields work. -export default class Field extends React.PureComponent< - Props, - IState -> { - private id: string; - private input: - | HTMLInputElement - | HTMLTextAreaElement - | HTMLSelectElement - | undefined; - - public static readonly defaultProps = { - element: "input", - type: "text", - showValidMsg: false, - showErrorMsg: false, - isRequired: false, - }; - - constructor(props: Props) { - super(props); - this.state = { - error: undefined, - progress: undefined, - }; - - this.id = this.props.id || getId(); - } - - public validate = async (value?: FieldValue) => { - if (!this.props.onValidate) { - return undefined; - } - - const validationResult = await this.props.onValidate(value); - if (validationResult.progress !== undefined) { - this.setState({ progress: validationResult.progress }); - } else { - this.setState({ progress: undefined }); - } - return validationResult.error; - }; - - public render() { - /* eslint @typescript-eslint/no-unused-vars: ["error", { "ignoreRestSiblings": true }] */ - const { - element, - onValidate, - children, - list, - showErrorMsg, - showValidMsg, - ...inputProps - } = this.props; - - // Set some defaults for the element - const ref = (input: any) => (this.input = input); - inputProps.placeholder = inputProps.placeholder || inputProps.label; - inputProps.id = this.id; // this overwrites the id from props - - // Appease typescript's inference - const inputProps_ = { ...inputProps, ref, list }; - - if (!this.props.name) { - throw new Error("no name"); - } - - return ( - // Renders an Atlaskit Field based on provided props to this component. - // Used inside Atlaskit Form components. See commnets in this file and - // Atlaskit documentation for more details. - - label={this.props.label} - name={this.props.name} - validate={this.validate} - defaultValue={this.props.defaultValue} - isRequired={this.props.isRequired}> - {({ fieldProps, error, valid }: any) => { - if (element === "input") { - return ( - - { - // trigger both handlers if set - fieldProps.onChange?.(e); - inputProps_.onChange?.(e as any); - }} - /> - {this.state.progress !== undefined && ( -
- -
- )} - {valid && - (showValidMsg === true || - (showValidMsg === "if-not-empty" && - !!fieldProps.value?.length)) && ( - {this.props.validMessage} - )} - {showErrorMsg && error && {error}} -
- ); - } else if (element === "select") { - return ( - - inputProps_.onChange?.(e as any); - }} - /> - ); - } else { - throw new Error("not implemented"); - } - }} - - ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/elements/SSOButtons.tsx b/packages/editor/src/app/matrix-auth/auth/elements/SSOButtons.tsx deleted file mode 100644 index 9ae026a34..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/SSOButtons.tsx +++ /dev/null @@ -1,153 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import classNames from "classnames"; -import React from "react"; - -import Button from "@atlaskit/button"; -import { MatrixClient } from "matrix-js-sdk"; -import { startSingleSignOn } from "../../AuthStoreUtil"; -import AuthStyles from "../AuthStyles.module.css"; -import { - IdentityProviderBrand, - IIdentityProvider, - ISSOFlow, -} from "../LoginHelper"; -import { mediaFromMxc } from "../util/Media"; -import apple from "./res/apple.svg"; -import facebook from "./res/facebook.svg"; -import github from "./res/github.svg"; -import gitlab from "./res/gitlab.svg"; -import google from "./res/google.svg"; -import twitter from "./res/twitter.svg"; - -interface ISSOButtonProps extends Omit { - idp: IIdentityProvider; -} - -const getIcon = (brand: IdentityProviderBrand | string) => { - switch (brand) { - case IdentityProviderBrand.Apple: - return apple; - case IdentityProviderBrand.Facebook: - return facebook; - case IdentityProviderBrand.Github: - return github; - case IdentityProviderBrand.Gitlab: - return gitlab; - case IdentityProviderBrand.Google: - return google; - case IdentityProviderBrand.Twitter: - return twitter; - default: - return null; - } -}; - -const SSOButton: React.FC = ({ - matrixClient, - loginType, - pageAfterLogin, - idp, - primary, - ...props -}) => { - const label = idp - ? `Continue with ${idp.name}` - : "Sign in with single sign-on"; - - const onClick = () => { - startSingleSignOn(matrixClient, loginType as any, pageAfterLogin, idp?.id); - }; - - let icon; - let brandClass: string | undefined; - - const brandIcon = idp && idp.brand ? getIcon(idp.brand) : null; - if (brandIcon && idp.brand) { - const brandName = idp.brand.split(".").pop(); - brandClass = `mx_SSOButton_brand_${brandName}`; - icon = {brandName}; - } else if (typeof idp?.icon === "string" && idp.icon.startsWith("mxc://")) { - const src = mediaFromMxc(idp.icon, matrixClient).getSquareThumbnailHttp(24); - icon = {idp.name}; - } - - const classes = classNames(AuthStyles.SSOButton, AuthStyles.AuthButton, { - [brandClass!]: brandClass, - mx_SSOButton_default: !idp, - mx_SSOButton_primary: primary, - }); - - // if (mini) { - // // TODO fallback icon - // return ( - // - // {icon} - // - // ); - // } - - return ( - - ); -}; - -interface IProps { - matrixClient: MatrixClient; - flow: ISSOFlow; - loginType?: "sso" | "cas"; - pageAfterLogin?: string; - primary?: boolean; -} - -const SSOButtons: React.FC = ({ - matrixClient, - flow, - loginType, - pageAfterLogin, - primary, -}) => { - const providers = flow.identity_providers || []; - - return ( -
- {providers.map((idp: any) => ( - - ))} -
- ); -}; - -export default SSOButtons; diff --git a/packages/editor/src/app/matrix-auth/auth/elements/Spinner.tsx b/packages/editor/src/app/matrix-auth/auth/elements/Spinner.tsx deleted file mode 100644 index 795fc3241..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/Spinner.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd -Copyright 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import PropTypes from "prop-types"; - -const Spinner = ({ - w = 32, - h = 32, - message, -}: { - w?: number; - h?: number; - message?: string; -}) => ( -
- {message && ( - -
{message}
  -
- )} -
-
-); - -Spinner.propTypes = { - w: PropTypes.number, - h: PropTypes.number, - message: PropTypes.node, -}; - -export default Spinner; diff --git a/packages/editor/src/app/matrix-auth/auth/elements/Validation.tsx b/packages/editor/src/app/matrix-auth/auth/elements/Validation.tsx deleted file mode 100644 index f52eeccd5..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/Validation.tsx +++ /dev/null @@ -1,191 +0,0 @@ -/* -Copyright 2019 New Vector Ltd -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import classNames from "classnames"; - -type Data = Pick; - -interface IRule { - key: string; - final?: boolean; - skip?(this: T, data: Data, derivedData?: D): boolean; - test(this: T, data: Data, derivedData?: D): boolean | Promise; - valid?(this: T, derivedData?: D): string; - invalid?(this: T, derivedData?: D): string; -} - -interface IArgs { - rules: IRule[]; - description?(this: T, derivedData?: D): React.ReactChild; - hideDescriptionIfValid?: boolean; - deriveData?(data: Data): Promise; -} - -export interface IFieldState { - value: string | undefined; - focused: boolean; - allowEmpty: boolean; -} - -export interface IValidationResult { - valid?: boolean; - feedback?: React.ReactChild; -} - -/** - * Creates a validation function from a set of rules describing what to validate. - * Generic T is the "this" type passed to the rule methods - * - * @param {Function} description - * Function that returns a string summary of the kind of value that will - * meet the validation rules. Shown at the top of the validation feedback. - * @param {Boolean} hideDescriptionIfValid - * If true, don't show the description if the validation passes validation. - * @param {Function} deriveData - * Optional function that returns a Promise to an object of generic type D. - * The result of this Promise is passed to rule methods `skip`, `test`, `valid`, and `invalid`. - * Useful for doing calculations per-value update once rather than in each of the above rule methods. - * @param {Object} rules - * An array of rules describing how to check to input value. Each rule in an object - * and may have the following properties: - * - `key`: A unique ID for the rule. Required. - * - `skip`: A function used to determine whether the rule should even be evaluated. - * - `test`: A function used to determine the rule's current validity. Required. - * - `valid`: Function returning text to show when the rule is valid. Only shown if set. - * - `invalid`: Function returning text to show when the rule is invalid. Only shown if set. - * - `final`: A Boolean if true states that this rule will only be considered if all rules before it returned valid. - * @returns {Function} - * A validation function that takes in the current input value and returns - * the overall validity and a feedback UI that can be rendered for more detail. - */ -export default function withValidation({ - description, - hideDescriptionIfValid, - deriveData, - rules, -}: IArgs) { - return async function onValidate( - this: T, - { value, focused, allowEmpty = true }: IFieldState - ): Promise { - if (!value && allowEmpty) { - return {}; - } - - const data = { value, allowEmpty }; - const derivedData = deriveData ? await deriveData(data) : undefined; - - const results = []; - let valid = true; - if (rules && rules.length) { - for (const rule of rules) { - if (!rule.key || !rule.test) { - continue; - } - - if (!valid && rule.final) { - continue; - } - - if (rule.skip && rule.skip.call(this, data, derivedData)) { - continue; - } - - // We're setting `this` to whichever component holds the validation - // function. That allows rules to access the state of the component. - const ruleValid = await rule.test.call(this, data, derivedData); - valid = valid && ruleValid; - if (ruleValid && rule.valid) { - // If the rule's result is valid and has text to show for - // the valid state, show it. - const text = rule.valid.call(this, derivedData); - if (!text) { - continue; - } - results.push({ - key: rule.key, - valid: true, - text, - }); - } else if (!ruleValid && rule.invalid) { - // If the rule's result is invalid and has text to show for - // the invalid state, show it. - const text = rule.invalid.call(this, derivedData); - if (!text) { - continue; - } - results.push({ - key: rule.key, - valid: false, - text, - }); - } - } - } - - // Hide feedback when not focused - if (!focused) { - return { - valid, - }; - } - - let details; - if (results && results.length) { - details = ( -
    - {results.map((result) => { - const classes = classNames({ - mx_Validation_detail: true, - mx_Validation_valid: result.valid, - mx_Validation_invalid: !result.valid, - }); - return ( -
  • - {result.text} -
  • - ); - })} -
- ); - } - - let summary; - if (description && (details || !hideDescriptionIfValid)) { - // We're setting `this` to whichever component holds the validation - // function. That allows rules to access the state of the component. - const content = description.call(this, derivedData); - summary =
{content}
; - } - - let feedback; - if (summary || details) { - feedback = ( -
- {summary} - {details} -
- ); - } - - return { - valid, - feedback, - }; - }; -} diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/apple.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/apple.svg deleted file mode 100644 index 308c3c5d5..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/apple.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/facebook.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/facebook.svg deleted file mode 100644 index 274278542..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/facebook.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/github.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/github.svg deleted file mode 100644 index 503719520..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/github.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/gitlab.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/gitlab.svg deleted file mode 100644 index df84c41e2..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/gitlab.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/google.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/google.svg deleted file mode 100644 index 1b0b19ae5..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/google.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/editor/src/app/matrix-auth/auth/elements/res/twitter.svg b/packages/editor/src/app/matrix-auth/auth/elements/res/twitter.svg deleted file mode 100644 index 43eb825a5..000000000 --- a/packages/editor/src/app/matrix-auth/auth/elements/res/twitter.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/packages/editor/src/app/matrix-auth/auth/util/AutoDiscoveryUtils.tsx b/packages/editor/src/app/matrix-auth/auth/util/AutoDiscoveryUtils.tsx deleted file mode 100644 index 915eaad4f..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/AutoDiscoveryUtils.tsx +++ /dev/null @@ -1,293 +0,0 @@ -/* -Copyright 2019-2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { ReactNode } from "react"; -import { AutoDiscovery } from "matrix-js-sdk"; -// import { _t, _td, newTranslatableError } from "../languageHandler"; -// import { makeType } from "./TypeUtils"; -// import SdkConfig from "../SdkConfig"; - -const LIVELINESS_DISCOVERY_ERRORS: string[] = [ - AutoDiscovery.ERROR_INVALID_HOMESERVER, - AutoDiscovery.ERROR_INVALID_IDENTITY_SERVER, -]; - -export type ValidatedServerConfig = { - hsUrl: string; - hsName: string; - hsNameIsDifferent: boolean; - - isUrl: string; - - isDefault: boolean; - // when the server config is based on static URLs the hsName is not resolvable and things may wish to use hsUrl - isNameResolvable: boolean; - - warning: string | null; -}; - -export interface IAuthComponentState { - serverIsAlive: boolean; - serverErrorIsFatal: boolean; - serverDeadError?: ReactNode; -} - -export default class AutoDiscoveryUtils { - /** - * Checks if a given error or error message is considered an error - * relating to the liveliness of the server. Must be an error returned - * from this AutoDiscoveryUtils class. - * @param {string | Error} error The error to check - * @returns {boolean} True if the error is a liveliness error. - */ - static isLivelinessError(error: string | Error): boolean { - if (!error) return false; - return !!LIVELINESS_DISCOVERY_ERRORS.find((e) => - typeof error === "string" ? e === error : e === error.message - ); - } - - /** - * Gets the common state for auth components (login, registration, forgot - * password) for a given validation error. - * @param {Error} err The error encountered. - * @param {string} pageName The page for which the error should be customized to. See - * implementation for known values. - * @returns {*} The state for the component, given the error. - */ - static authComponentStateForError( - err: string | Error | null, - pageName = "login" - ): IAuthComponentState { - if (!err) { - return { - serverIsAlive: true, - serverErrorIsFatal: false, - serverDeadError: null, - }; - } - let title = "Cannot reach homeserver"; - let body: ReactNode = - "Ensure you have a stable internet connection, or get in touch with the server admin"; - if (!AutoDiscoveryUtils.isLivelinessError(err)) { - const brand = "TypeCell"; - title = `Your ${brand} is misconfigured`; - body = ( - <> - Ask your {brand} admin to check{" "} - - your config - - - ); - } - - let isFatalError = true; - const errorMessage = typeof err === "string" ? err : err.message; - if (errorMessage === AutoDiscovery.ERROR_INVALID_IDENTITY_SERVER) { - isFatalError = false; - title = "Cannot reach identity server"; - - // It's annoying having a ladder for the third word in the same sentence, but our translations - // don't make this easy to avoid. - if (pageName === "register") { - body = - "You can register, but some features will be unavailable until the identity server is " + - "back online. If you keep seeing this warning, check your configuration or contact a server " + - "admin."; - } else if (pageName === "reset_password") { - body = - "You can reset your password, but some features will be unavailable until the identity " + - "server is back online. If you keep seeing this warning, check your configuration or contact " + - "a server admin."; - } else { - body = - "You can log in, but some features will be unavailable until the identity server is " + - "back online. If you keep seeing this warning, check your configuration or contact a server " + - "admin."; - } - } - - return { - serverIsAlive: false, - serverErrorIsFatal: isFatalError, - serverDeadError: ( -
- {title} -
{body}
-
- ), - }; - } - - /** - * Validates a server configuration, using a pair of URLs as input. - * @param {string} homeserverUrl The homeserver URL. - * @param {string} identityUrl The identity server URL. - * @param {boolean} syntaxOnly If true, errors relating to liveliness of the servers will - * not be raised. - * @returns {Promise} Resolves to the validated configuration. - */ - static async validateServerConfigWithStaticUrls( - homeserverUrl: string, - identityUrl?: string, - syntaxOnly = false - ): Promise { - if (!homeserverUrl) { - throw new Error("No homeserver URL provided"); - } - - const wellknownConfig: any = { - "m.homeserver": { - base_url: homeserverUrl, - }, - }; - - if (identityUrl) { - wellknownConfig["m.identity_server"] = { - base_url: identityUrl, - }; - } - - const result = await AutoDiscovery.fromDiscoveryConfig(wellknownConfig); - - const url = new URL(homeserverUrl); - const serverName = url.hostname; - - return AutoDiscoveryUtils.buildValidatedConfigFromDiscovery( - serverName, - result, - syntaxOnly, - true - ); - } - - /** - * Validates a server configuration, using a homeserver domain name as input. - * @param {string} serverName The homeserver domain name (eg: "matrix.org") to validate. - * @returns {Promise} Resolves to the validated configuration. - */ - static async validateServerName( - serverName: string - ): Promise { - const result = await AutoDiscovery.findClientConfig(serverName); - return AutoDiscoveryUtils.buildValidatedConfigFromDiscovery( - serverName, - result - ); - } - - /** - * Validates a server configuration, using a pre-calculated AutoDiscovery result as - * input. - * @param {string} serverName The domain name the AutoDiscovery result is for. - * @param {*} discoveryResult The AutoDiscovery result. - * @param {boolean} syntaxOnly If true, errors relating to liveliness of the servers will not be raised. - * @param {boolean} isSynthetic If true, then the discoveryResult was synthesised locally. - * @returns {Promise} Resolves to the validated configuration. - */ - static buildValidatedConfigFromDiscovery( - serverName: string, - discoveryResult: any, - syntaxOnly = false, - isSynthetic = false - ): ValidatedServerConfig { - if (!discoveryResult || !discoveryResult["m.homeserver"]) { - // This shouldn't happen without major misconfiguration, so we'll log a bit of information - // in the log so we can find this bit of codee but otherwise tell teh user "it broke". - console.error( - "Ended up in a state of not knowing which homeserver to connect to." - ); - throw new Error("Unexpected error resolving homeserver configuration"); - } - - const hsResult = discoveryResult["m.homeserver"]; - const isResult = discoveryResult["m.identity_server"]; - - const defaultConfig = undefined as any; //SdkConfig.get()["validated_server_config"]; - - // Validate the identity server first because an invalid identity server causes - // an invalid homeserver, which may not be picked up correctly. - - // Note: In the cases where we rely on the default IS from the config (namely - // lack of identity server provided by the discovery method), we intentionally do not - // validate it. This has already been validated and this helps some off-the-grid usage - // of Element. - let preferredIdentityUrl = defaultConfig && defaultConfig["isUrl"]; - if (isResult && isResult.state === AutoDiscovery.SUCCESS) { - preferredIdentityUrl = isResult["base_url"]; - } else if (isResult && isResult.state !== AutoDiscovery.PROMPT) { - console.error( - "Error determining preferred identity server URL:", - isResult - ); - if (isResult.state === AutoDiscovery.FAIL_ERROR) { - if (AutoDiscovery.ALL_ERRORS.indexOf(isResult.error) !== -1) { - throw new Error(isResult.error); - } - throw new Error( - "Unexpected error resolving identity server configuration" - ); - } // else the error is not related to syntax - continue anyways. - - // rewrite homeserver error since we don't care about problems - hsResult.error = AutoDiscovery.ERROR_INVALID_IDENTITY_SERVER; - - // Also use the user's supplied identity server if provided - if (isResult["base_url"]) preferredIdentityUrl = isResult["base_url"]; - } - - if (hsResult.state !== AutoDiscovery.SUCCESS) { - console.error("Error processing homeserver config:", hsResult); - if ( - !syntaxOnly || - !AutoDiscoveryUtils.isLivelinessError(hsResult.error) - ) { - if (AutoDiscovery.ALL_ERRORS.indexOf(hsResult.error) !== -1) { - throw Error(hsResult.error); - } - throw Error("Unexpected error resolving homeserver configuration"); - } // else the error is not related to syntax - continue anyways. - } - - const preferredHomeserverUrl = hsResult["base_url"]; - let preferredHomeserverName = serverName - ? serverName - : hsResult["server_name"]; - - const url = new URL(preferredHomeserverUrl); - if (!preferredHomeserverName) preferredHomeserverName = url.hostname; - - // It should have been set by now, so check it - if (!preferredHomeserverName) { - console.error("Failed to parse homeserver name from homeserver URL"); - throw new Error("Unexpected error resolving homeserver configuration"); - } - - return { - hsUrl: preferredHomeserverUrl, - hsName: preferredHomeserverName, - hsNameIsDifferent: url.hostname !== preferredHomeserverName, - isUrl: preferredIdentityUrl, - isDefault: false, - warning: hsResult.error, - isNameResolvable: !isSynthetic, - }; - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/IMediaEventContent.ts b/packages/editor/src/app/matrix-auth/auth/util/IMediaEventContent.ts deleted file mode 100644 index 4e704454d..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/IMediaEventContent.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2021 The Matrix.org Foundation C.I.C. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// TODO: These types should be elsewhere. - -export interface IEncryptedFile { - url: string; - mimetype?: string; - key: { - alg: string; - key_ops: string[]; // eslint-disable-line camelcase - kty: string; - k: string; - ext: boolean; - }; - iv: string; - hashes: { [alg: string]: string }; - v: string; -} - -export interface IMediaEventContent { - url?: string; // required on unencrypted media - file?: IEncryptedFile; // required for *encrypted* media - info?: { - thumbnail_url?: string; // eslint-disable-line camelcase - thumbnail_file?: IEncryptedFile; // eslint-disable-line camelcase - }; -} - -export interface IPreparedMedia extends IMediaObject { - thumbnail?: IMediaObject; -} - -export interface IMediaObject { - mxc: string; - file?: IEncryptedFile; -} - -/** - * Parses an event content body into a prepared media object. This prepared media object - * can be used with other functions to manipulate the media. - * @param {IMediaEventContent} content Unredacted media event content. See interface. - * @returns {IPreparedMedia} A prepared media object. - * @throws Throws if the given content cannot be packaged into a prepared media object. - */ -export function prepEventContentAsMedia( - content: IMediaEventContent -): IPreparedMedia { - let thumbnail: undefined | IMediaObject; - if (content?.info?.thumbnail_url) { - thumbnail = { - mxc: content.info.thumbnail_url, - file: content.info.thumbnail_file, - }; - } else if (content?.info?.thumbnail_file?.url) { - thumbnail = { - mxc: content.info.thumbnail_file.url, - file: content.info.thumbnail_file, - }; - } - - if (content?.url) { - return { - thumbnail, - mxc: content.url, - file: content.file, - }; - } else if (content?.file?.url) { - return { - thumbnail, - mxc: content.file.url, - file: content.file, - }; - } - - throw new Error( - "Invalid file provided: cannot determine MXC URI. Has it been redacted?" - ); -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/Media.ts b/packages/editor/src/app/matrix-auth/auth/util/Media.ts deleted file mode 100644 index 99f127389..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/Media.ts +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2021 The Matrix.org Foundation C.I.C. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { MatrixClient } from "matrix-js-sdk"; -import { MatrixClientPeg } from "../../MatrixClientPeg"; -import { - IMediaEventContent, - IPreparedMedia, - prepEventContentAsMedia, -} from "./IMediaEventContent"; - -// Populate this class with the details of your customisations when copying it. - -// Implementation note: The Media class must complete the contract as shown here, though -// the constructor can be whatever is relevant to your implementation. The mediaForX -// functions below create an instance of the Media class and are used throughout the -// project. - -type ResizeMethod = "crop" | "scale"; - -/** - * A media object is a representation of a "source media" and an optional - * "thumbnail media", derived from event contents or external sources. - */ -export class Media { - private client: MatrixClient; - - // Per above, this constructor signature can be whatever is helpful for you. - constructor(private prepared: IPreparedMedia, client?: MatrixClient) { - this.client = client ?? MatrixClientPeg.get(); - if (!this.client) { - throw new Error( - "No possible MatrixClient for media resolution. Please provide one or log in." - ); - } - } - - /** - * True if the media appears to be encrypted. Actual file contents may vary. - */ - public get isEncrypted(): boolean { - return !!this.prepared.file; - } - - /** - * The MXC URI of the source media. - */ - public get srcMxc(): string { - return this.prepared.mxc; - } - - /** - * The MXC URI of the thumbnail media, if a thumbnail is recorded. Null/undefined - * otherwise. - */ - public get thumbnailMxc(): string | undefined | null { - return this.prepared.thumbnail?.mxc; - } - - /** - * Whether or not a thumbnail is recorded for this media. - */ - public get hasThumbnail(): boolean { - return !!this.thumbnailMxc; - } - - /** - * The HTTP URL for the source media. - */ - public get srcHttp(): string { - return this.client.mxcUrlToHttp(this.srcMxc) as string; - } - - /** - * The HTTP URL for the thumbnail media (without any specified width, height, etc). Null/undefined - * if no thumbnail media recorded. - */ - public get thumbnailHttp(): string | undefined | null { - if (!this.hasThumbnail) return null; - return this.client.mxcUrlToHttp(this.thumbnailMxc!); - } - - /** - * Gets the HTTP URL for the thumbnail media with the requested characteristics, if a thumbnail - * is recorded for this media. Returns null/undefined otherwise. - * @param {number} width The desired width of the thumbnail. - * @param {number} height The desired height of the thumbnail. - * @param {"scale"|"crop"} mode The desired thumbnailing mode. Defaults to scale. - * @returns {string} The HTTP URL which points to the thumbnail. - */ - public getThumbnailHttp( - width: number, - height: number, - mode: ResizeMethod = "scale" - ): string | null | undefined { - if (!this.hasThumbnail) return null; - // scale using the device pixel ratio to keep images clear - width = Math.floor(width * window.devicePixelRatio); - height = Math.floor(height * window.devicePixelRatio); - return this.client.mxcUrlToHttp(this.thumbnailMxc!, width, height, mode); - } - - /** - * Gets the HTTP URL for a thumbnail of the source media with the requested characteristics. - * @param {number} width The desired width of the thumbnail. - * @param {number} height The desired height of the thumbnail. - * @param {"scale"|"crop"} mode The desired thumbnailing mode. Defaults to scale. - * @returns {string} The HTTP URL which points to the thumbnail. - */ - public getThumbnailOfSourceHttp( - width: number, - height: number, - mode: ResizeMethod = "scale" - ): string { - // scale using the device pixel ratio to keep images clear - width = Math.floor(width * window.devicePixelRatio); - height = Math.floor(height * window.devicePixelRatio); - return this.client.mxcUrlToHttp(this.srcMxc, width, height, mode)!; - } - - /** - * Creates a square thumbnail of the media. If the media has a thumbnail recorded, that MXC will - * be used, otherwise the source media will be used. - * @param {number} dim The desired width and height. - * @returns {string} An HTTP URL for the thumbnail. - */ - public getSquareThumbnailHttp(dim: number): string { - dim = Math.floor(dim * window.devicePixelRatio); // scale using the device pixel ratio to keep images clear - if (this.hasThumbnail) { - return this.getThumbnailHttp(dim, dim, "crop")!; - } - return this.getThumbnailOfSourceHttp(dim, dim, "crop"); - } - - /** - * Downloads the source media. - * @returns {Promise} Resolves to the server's response for chaining. - */ - public downloadSource(): Promise { - return fetch(this.srcHttp); - } -} - -/** - * Creates a media object from event content. - * @param {IMediaEventContent} content The event content. - * @param {MatrixClient} client? Optional client to use. - * @returns {Media} The media object. - */ -export function mediaFromContent( - content: IMediaEventContent, - client?: MatrixClient -): Media { - return new Media(prepEventContentAsMedia(content), client); -} - -/** - * Creates a media object from an MXC URI. - * @param {string} mxc The MXC URI. - * @param {MatrixClient} client? Optional client to use. - * @returns {Media} The media object. - */ -export function mediaFromMxc(mxc: string, client?: MatrixClient): Media { - return mediaFromContent({ url: mxc }, client); -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/PasswordScorer.tsx b/packages/editor/src/app/matrix-auth/auth/util/PasswordScorer.tsx deleted file mode 100644 index 0fb11687b..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/PasswordScorer.tsx +++ /dev/null @@ -1,55 +0,0 @@ -/* -Copyright 2018 New Vector Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import zxcvbn from "zxcvbn"; - -const ZXCVBN_USER_INPUTS = ["riot", "matrix", "typecell"]; - -/** - * Wrapper around zxcvbn password strength estimation - * Include this only from async components: it pulls in zxcvbn - * (obviously) which is large. - * - * @param {string} password Password to score - * @returns {object} Score result with `score` and `feedback` properties - */ -export function scorePassword(password: string) { - if (password.length === 0) return null; - - const userInputs = ZXCVBN_USER_INPUTS.slice(); - // if (MatrixClientPeg.get()) { - // userInputs.push(MatrixClientPeg.get().getUserIdLocalpart()); - // } - - let zxcvbnResult = zxcvbn(password, userInputs); - // Work around https://github.com/dropbox/zxcvbn/issues/216 - if (password.includes(" ")) { - const resultNoSpaces = zxcvbn(password.replace(/ /g, ""), userInputs); - if (resultNoSpaces.score < zxcvbnResult.score) - zxcvbnResult = resultNoSpaces; - } - - // for (let i = 0; i < zxcvbnResult.feedback.suggestions.length; ++i) { - // translate suggestions - // zxcvbnResult.feedback.suggestions[i] = zxcvbnResult.feedback.suggestions[i]; - // } - // and warning, if any - // if (zxcvbnResult.feedback.warning) { - // zxcvbnResult.feedback.warning = zxcvbnResult.feedback.warning; - // } - - return zxcvbnResult; -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/email.ts b/packages/editor/src/app/matrix-auth/auth/util/email.ts deleted file mode 100644 index 5c9fe20be..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/email.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* -Copyright 2016 OpenMarket Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Regexp based on Simpler Version from https://gist.github.com/gregseth/5582254 - matches RFC2822 -const EMAIL_ADDRESS_REGEX = new RegExp( - "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*" + // localpart - "@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", - "i" -); - -export function looksValidEmail(email: string): boolean { - return EMAIL_ADDRESS_REGEX.test(email); -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/matrix.ts b/packages/editor/src/app/matrix-auth/auth/util/matrix.ts deleted file mode 100644 index 1ef8cf160..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/matrix.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface IMatrixClientCreds { - homeserverUrl: string; - identityServerUrl: string | undefined; - userId: string; - deviceId?: string; - accessToken: string; - guest?: boolean; - pickleKey?: string | undefined; - freshLogin?: boolean; -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/messages.tsx b/packages/editor/src/app/matrix-auth/auth/util/messages.tsx deleted file mode 100644 index 86e984278..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/messages.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/* -Copyright 2018 New Vector Ltd -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/** - * Produce a translated error message for a - * M_RESOURCE_LIMIT_EXCEEDED error - * - * @param {string} limitType The limit_type from the error - * @param {string} adminContact The admin_contact from the error - * @param {Object} strings Translateable string for different - * limit_type. Must include at least the empty string key - * which is the default. Strings may include an 'a' tag - * for the admin contact link. - * @param {Object} extraTranslations Extra translation substitution functions - * for any tags in the strings apart from 'a' - * @returns {*} Translated string or react component - */ -export function messageForResourceLimitError( - limitType: string, - strings: { [key: string]: string } -) { - let errString = strings[limitType]; - if (errString === undefined) errString = strings[""]; - - return errString; -} - -export function messageForSyncError(err: any) { - if (err.errcode === "M_RESOURCE_LIMIT_EXCEEDED") { - const limitError = messageForResourceLimitError(err.data.limit_type, { - monthly_active_user: - "This homeserver has hit its Monthly Active User limit.", - hs_blocked: "This homeserver has been blocked by its administrator.", - "": "This homeserver has exceeded one of its resource limits.", - }); - const adminContact = messageForResourceLimitError(err.data.limit_type, { - "": "Please contact your service administrator to continue using the service.", // TODO: link to admin contact - }); - return ( -
-
{limitError}
-
{adminContact}
-
- ); - } else { - return
{"Unable to connect to Homeserver. Retrying..."}
; - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/util/phonenumber.ts b/packages/editor/src/app/matrix-auth/auth/util/phonenumber.ts deleted file mode 100644 index 60a0fc652..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/phonenumber.ts +++ /dev/null @@ -1,1297 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -const PHONE_NUMBER_REGEXP = /^[0-9 -.]+$/; - -export type Country = { - iso2: string; - name: string; - prefix: string; -}; - -/* - * Do basic validation to determine if the given input could be - * a valid phone number. - * - * @param {String} phoneNumber The string to validate. This could be - * either an international format number (MSISDN or e.164) or - * a national-format number. - * @return True if the number could be a valid phone number, otherwise false. - */ -export function phoneNumberLooksValid(phoneNumber: string) { - return PHONE_NUMBER_REGEXP.test(phoneNumber); -} - -// Regional Indicator Symbol Letter A -const UNICODE_BASE = 127462 - "A".charCodeAt(0); -// Country code should be exactly 2 uppercase characters -const COUNTRY_CODE_REGEX = /^[A-Z]{2}$/; - -export const getEmojiFlag = (countryCode: string) => { - if (!COUNTRY_CODE_REGEX.test(countryCode)) return ""; - // Rip the country code out of the emoji and use that - return String.fromCodePoint( - ...countryCode.split("").map((l) => UNICODE_BASE + l.charCodeAt(0)) - ); -}; - -export const COUNTRIES: Country[] = [ - { - iso2: "GB", - name: "United Kingdom", - prefix: "44", - }, - { - iso2: "US", - name: "United States", - prefix: "1", - }, - { - iso2: "AF", - name: "Afghanistan", - prefix: "93", - }, - { - iso2: "AX", - name: "\u00c5land Islands", - prefix: "358", - }, - { - iso2: "AL", - name: "Albania", - prefix: "355", - }, - { - iso2: "DZ", - name: "Algeria", - prefix: "213", - }, - { - iso2: "AS", - name: "American Samoa", - prefix: "1", - }, - { - iso2: "AD", - name: "Andorra", - prefix: "376", - }, - { - iso2: "AO", - name: "Angola", - prefix: "244", - }, - { - iso2: "AI", - name: "Anguilla", - prefix: "1", - }, - { - iso2: "AQ", - name: "Antarctica", - prefix: "672", - }, - { - iso2: "AG", - name: "Antigua & Barbuda", - prefix: "1", - }, - { - iso2: "AR", - name: "Argentina", - prefix: "54", - }, - { - iso2: "AM", - name: "Armenia", - prefix: "374", - }, - { - iso2: "AW", - name: "Aruba", - prefix: "297", - }, - { - iso2: "AU", - name: "Australia", - prefix: "61", - }, - { - iso2: "AT", - name: "Austria", - prefix: "43", - }, - { - iso2: "AZ", - name: "Azerbaijan", - prefix: "994", - }, - { - iso2: "BS", - name: "Bahamas", - prefix: "1", - }, - { - iso2: "BH", - name: "Bahrain", - prefix: "973", - }, - { - iso2: "BD", - name: "Bangladesh", - prefix: "880", - }, - { - iso2: "BB", - name: "Barbados", - prefix: "1", - }, - { - iso2: "BY", - name: "Belarus", - prefix: "375", - }, - { - iso2: "BE", - name: "Belgium", - prefix: "32", - }, - { - iso2: "BZ", - name: "Belize", - prefix: "501", - }, - { - iso2: "BJ", - name: "Benin", - prefix: "229", - }, - { - iso2: "BM", - name: "Bermuda", - prefix: "1", - }, - { - iso2: "BT", - name: "Bhutan", - prefix: "975", - }, - { - iso2: "BO", - name: "Bolivia", - prefix: "591", - }, - { - iso2: "BA", - name: "Bosnia", - prefix: "387", - }, - { - iso2: "BW", - name: "Botswana", - prefix: "267", - }, - { - iso2: "BV", - name: "Bouvet Island", - prefix: "47", - }, - { - iso2: "BR", - name: "Brazil", - prefix: "55", - }, - { - iso2: "IO", - name: "British Indian Ocean Territory", - prefix: "246", - }, - { - iso2: "VG", - name: "British Virgin Islands", - prefix: "1", - }, - { - iso2: "BN", - name: "Brunei", - prefix: "673", - }, - { - iso2: "BG", - name: "Bulgaria", - prefix: "359", - }, - { - iso2: "BF", - name: "Burkina Faso", - prefix: "226", - }, - { - iso2: "BI", - name: "Burundi", - prefix: "257", - }, - { - iso2: "KH", - name: "Cambodia", - prefix: "855", - }, - { - iso2: "CM", - name: "Cameroon", - prefix: "237", - }, - { - iso2: "CA", - name: "Canada", - prefix: "1", - }, - { - iso2: "CV", - name: "Cape Verde", - prefix: "238", - }, - { - iso2: "BQ", - name: "Caribbean Netherlands", - prefix: "599", - }, - { - iso2: "KY", - name: "Cayman Islands", - prefix: "1", - }, - { - iso2: "CF", - name: "Central African Republic", - prefix: "236", - }, - { - iso2: "TD", - name: "Chad", - prefix: "235", - }, - { - iso2: "CL", - name: "Chile", - prefix: "56", - }, - { - iso2: "CN", - name: "China", - prefix: "86", - }, - { - iso2: "CX", - name: "Christmas Island", - prefix: "61", - }, - { - iso2: "CC", - name: "Cocos (Keeling) Islands", - prefix: "61", - }, - { - iso2: "CO", - name: "Colombia", - prefix: "57", - }, - { - iso2: "KM", - name: "Comoros", - prefix: "269", - }, - { - iso2: "CG", - name: "Congo - Brazzaville", - prefix: "242", - }, - { - iso2: "CD", - name: "Congo - Kinshasa", - prefix: "243", - }, - { - iso2: "CK", - name: "Cook Islands", - prefix: "682", - }, - { - iso2: "CR", - name: "Costa Rica", - prefix: "506", - }, - { - iso2: "HR", - name: "Croatia", - prefix: "385", - }, - { - iso2: "CU", - name: "Cuba", - prefix: "53", - }, - { - iso2: "CW", - name: "Cura\u00e7ao", - prefix: "599", - }, - { - iso2: "CY", - name: "Cyprus", - prefix: "357", - }, - { - iso2: "CZ", - name: "Czech Republic", - prefix: "420", - }, - { - iso2: "CI", - name: "C\u00f4te d\u2019Ivoire", - prefix: "225", - }, - { - iso2: "DK", - name: "Denmark", - prefix: "45", - }, - { - iso2: "DJ", - name: "Djibouti", - prefix: "253", - }, - { - iso2: "DM", - name: "Dominica", - prefix: "1", - }, - { - iso2: "DO", - name: "Dominican Republic", - prefix: "1", - }, - { - iso2: "EC", - name: "Ecuador", - prefix: "593", - }, - { - iso2: "EG", - name: "Egypt", - prefix: "20", - }, - { - iso2: "SV", - name: "El Salvador", - prefix: "503", - }, - { - iso2: "GQ", - name: "Equatorial Guinea", - prefix: "240", - }, - { - iso2: "ER", - name: "Eritrea", - prefix: "291", - }, - { - iso2: "EE", - name: "Estonia", - prefix: "372", - }, - { - iso2: "ET", - name: "Ethiopia", - prefix: "251", - }, - { - iso2: "FK", - name: "Falkland Islands", - prefix: "500", - }, - { - iso2: "FO", - name: "Faroe Islands", - prefix: "298", - }, - { - iso2: "FJ", - name: "Fiji", - prefix: "679", - }, - { - iso2: "FI", - name: "Finland", - prefix: "358", - }, - { - iso2: "FR", - name: "France", - prefix: "33", - }, - { - iso2: "GF", - name: "French Guiana", - prefix: "594", - }, - { - iso2: "PF", - name: "French Polynesia", - prefix: "689", - }, - { - iso2: "TF", - name: "French Southern Territories", - prefix: "262", - }, - { - iso2: "GA", - name: "Gabon", - prefix: "241", - }, - { - iso2: "GM", - name: "Gambia", - prefix: "220", - }, - { - iso2: "GE", - name: "Georgia", - prefix: "995", - }, - { - iso2: "DE", - name: "Germany", - prefix: "49", - }, - { - iso2: "GH", - name: "Ghana", - prefix: "233", - }, - { - iso2: "GI", - name: "Gibraltar", - prefix: "350", - }, - { - iso2: "GR", - name: "Greece", - prefix: "30", - }, - { - iso2: "GL", - name: "Greenland", - prefix: "299", - }, - { - iso2: "GD", - name: "Grenada", - prefix: "1", - }, - { - iso2: "GP", - name: "Guadeloupe", - prefix: "590", - }, - { - iso2: "GU", - name: "Guam", - prefix: "1", - }, - { - iso2: "GT", - name: "Guatemala", - prefix: "502", - }, - { - iso2: "GG", - name: "Guernsey", - prefix: "44", - }, - { - iso2: "GN", - name: "Guinea", - prefix: "224", - }, - { - iso2: "GW", - name: "Guinea-Bissau", - prefix: "245", - }, - { - iso2: "GY", - name: "Guyana", - prefix: "592", - }, - { - iso2: "HT", - name: "Haiti", - prefix: "509", - }, - { - iso2: "HM", - name: "Heard & McDonald Islands", - prefix: "672", - }, - { - iso2: "HN", - name: "Honduras", - prefix: "504", - }, - { - iso2: "HK", - name: "Hong Kong", - prefix: "852", - }, - { - iso2: "HU", - name: "Hungary", - prefix: "36", - }, - { - iso2: "IS", - name: "Iceland", - prefix: "354", - }, - { - iso2: "IN", - name: "India", - prefix: "91", - }, - { - iso2: "ID", - name: "Indonesia", - prefix: "62", - }, - { - iso2: "IR", - name: "Iran", - prefix: "98", - }, - { - iso2: "IQ", - name: "Iraq", - prefix: "964", - }, - { - iso2: "IE", - name: "Ireland", - prefix: "353", - }, - { - iso2: "IM", - name: "Isle of Man", - prefix: "44", - }, - { - iso2: "IL", - name: "Israel", - prefix: "972", - }, - { - iso2: "IT", - name: "Italy", - prefix: "39", - }, - { - iso2: "JM", - name: "Jamaica", - prefix: "1", - }, - { - iso2: "JP", - name: "Japan", - prefix: "81", - }, - { - iso2: "JE", - name: "Jersey", - prefix: "44", - }, - { - iso2: "JO", - name: "Jordan", - prefix: "962", - }, - { - iso2: "KZ", - name: "Kazakhstan", - prefix: "7", - }, - { - iso2: "KE", - name: "Kenya", - prefix: "254", - }, - { - iso2: "KI", - name: "Kiribati", - prefix: "686", - }, - { - iso2: "XK", - name: "Kosovo", - prefix: "383", - }, - { - iso2: "KW", - name: "Kuwait", - prefix: "965", - }, - { - iso2: "KG", - name: "Kyrgyzstan", - prefix: "996", - }, - { - iso2: "LA", - name: "Laos", - prefix: "856", - }, - { - iso2: "LV", - name: "Latvia", - prefix: "371", - }, - { - iso2: "LB", - name: "Lebanon", - prefix: "961", - }, - { - iso2: "LS", - name: "Lesotho", - prefix: "266", - }, - { - iso2: "LR", - name: "Liberia", - prefix: "231", - }, - { - iso2: "LY", - name: "Libya", - prefix: "218", - }, - { - iso2: "LI", - name: "Liechtenstein", - prefix: "423", - }, - { - iso2: "LT", - name: "Lithuania", - prefix: "370", - }, - { - iso2: "LU", - name: "Luxembourg", - prefix: "352", - }, - { - iso2: "MO", - name: "Macau", - prefix: "853", - }, - { - iso2: "MK", - name: "Macedonia", - prefix: "389", - }, - { - iso2: "MG", - name: "Madagascar", - prefix: "261", - }, - { - iso2: "MW", - name: "Malawi", - prefix: "265", - }, - { - iso2: "MY", - name: "Malaysia", - prefix: "60", - }, - { - iso2: "MV", - name: "Maldives", - prefix: "960", - }, - { - iso2: "ML", - name: "Mali", - prefix: "223", - }, - { - iso2: "MT", - name: "Malta", - prefix: "356", - }, - { - iso2: "MH", - name: "Marshall Islands", - prefix: "692", - }, - { - iso2: "MQ", - name: "Martinique", - prefix: "596", - }, - { - iso2: "MR", - name: "Mauritania", - prefix: "222", - }, - { - iso2: "MU", - name: "Mauritius", - prefix: "230", - }, - { - iso2: "YT", - name: "Mayotte", - prefix: "262", - }, - { - iso2: "MX", - name: "Mexico", - prefix: "52", - }, - { - iso2: "FM", - name: "Micronesia", - prefix: "691", - }, - { - iso2: "MD", - name: "Moldova", - prefix: "373", - }, - { - iso2: "MC", - name: "Monaco", - prefix: "377", - }, - { - iso2: "MN", - name: "Mongolia", - prefix: "976", - }, - { - iso2: "ME", - name: "Montenegro", - prefix: "382", - }, - { - iso2: "MS", - name: "Montserrat", - prefix: "1", - }, - { - iso2: "MA", - name: "Morocco", - prefix: "212", - }, - { - iso2: "MZ", - name: "Mozambique", - prefix: "258", - }, - { - iso2: "MM", - name: "Myanmar", - prefix: "95", - }, - { - iso2: "NA", - name: "Namibia", - prefix: "264", - }, - { - iso2: "NR", - name: "Nauru", - prefix: "674", - }, - { - iso2: "NP", - name: "Nepal", - prefix: "977", - }, - { - iso2: "NL", - name: "Netherlands", - prefix: "31", - }, - { - iso2: "NC", - name: "New Caledonia", - prefix: "687", - }, - { - iso2: "NZ", - name: "New Zealand", - prefix: "64", - }, - { - iso2: "NI", - name: "Nicaragua", - prefix: "505", - }, - { - iso2: "NE", - name: "Niger", - prefix: "227", - }, - { - iso2: "NG", - name: "Nigeria", - prefix: "234", - }, - { - iso2: "NU", - name: "Niue", - prefix: "683", - }, - { - iso2: "NF", - name: "Norfolk Island", - prefix: "672", - }, - { - iso2: "KP", - name: "North Korea", - prefix: "850", - }, - { - iso2: "MP", - name: "Northern Mariana Islands", - prefix: "1", - }, - { - iso2: "NO", - name: "Norway", - prefix: "47", - }, - { - iso2: "OM", - name: "Oman", - prefix: "968", - }, - { - iso2: "PK", - name: "Pakistan", - prefix: "92", - }, - { - iso2: "PW", - name: "Palau", - prefix: "680", - }, - { - iso2: "PS", - name: "Palestine", - prefix: "970", - }, - { - iso2: "PA", - name: "Panama", - prefix: "507", - }, - { - iso2: "PG", - name: "Papua New Guinea", - prefix: "675", - }, - { - iso2: "PY", - name: "Paraguay", - prefix: "595", - }, - { - iso2: "PE", - name: "Peru", - prefix: "51", - }, - { - iso2: "PH", - name: "Philippines", - prefix: "63", - }, - { - iso2: "PN", - name: "Pitcairn Islands", - prefix: "870", - }, - { - iso2: "PL", - name: "Poland", - prefix: "48", - }, - { - iso2: "PT", - name: "Portugal", - prefix: "351", - }, - { - iso2: "PR", - name: "Puerto Rico", - prefix: "1", - }, - { - iso2: "QA", - name: "Qatar", - prefix: "974", - }, - { - iso2: "RO", - name: "Romania", - prefix: "40", - }, - { - iso2: "RU", - name: "Russia", - prefix: "7", - }, - { - iso2: "RW", - name: "Rwanda", - prefix: "250", - }, - { - iso2: "RE", - name: "R\u00e9union", - prefix: "262", - }, - { - iso2: "WS", - name: "Samoa", - prefix: "685", - }, - { - iso2: "SM", - name: "San Marino", - prefix: "378", - }, - { - iso2: "SA", - name: "Saudi Arabia", - prefix: "966", - }, - { - iso2: "SN", - name: "Senegal", - prefix: "221", - }, - { - iso2: "RS", - name: "Serbia", - prefix: "381 p", - }, - { - iso2: "SC", - name: "Seychelles", - prefix: "248", - }, - { - iso2: "SL", - name: "Sierra Leone", - prefix: "232", - }, - { - iso2: "SG", - name: "Singapore", - prefix: "65", - }, - { - iso2: "SX", - name: "Sint Maarten", - prefix: "1", - }, - { - iso2: "SK", - name: "Slovakia", - prefix: "421", - }, - { - iso2: "SI", - name: "Slovenia", - prefix: "386", - }, - { - iso2: "SB", - name: "Solomon Islands", - prefix: "677", - }, - { - iso2: "SO", - name: "Somalia", - prefix: "252", - }, - { - iso2: "ZA", - name: "South Africa", - prefix: "27", - }, - { - iso2: "GS", - name: "South Georgia & South Sandwich Islands", - prefix: "500", - }, - { - iso2: "KR", - name: "South Korea", - prefix: "82", - }, - { - iso2: "SS", - name: "South Sudan", - prefix: "211", - }, - { - iso2: "ES", - name: "Spain", - prefix: "34", - }, - { - iso2: "LK", - name: "Sri Lanka", - prefix: "94", - }, - { - iso2: "BL", - name: "St. Barth\u00e9lemy", - prefix: "590", - }, - { - iso2: "SH", - name: "St. Helena", - prefix: "290 n", - }, - { - iso2: "KN", - name: "St. Kitts & Nevis", - prefix: "1", - }, - { - iso2: "LC", - name: "St. Lucia", - prefix: "1", - }, - { - iso2: "MF", - name: "St. Martin", - prefix: "590", - }, - { - iso2: "PM", - name: "St. Pierre & Miquelon", - prefix: "508", - }, - { - iso2: "VC", - name: "St. Vincent & Grenadines", - prefix: "1", - }, - { - iso2: "SD", - name: "Sudan", - prefix: "249", - }, - { - iso2: "SR", - name: "Suriname", - prefix: "597", - }, - { - iso2: "SJ", - name: "Svalbard & Jan Mayen", - prefix: "47", - }, - { - iso2: "SZ", - name: "Swaziland", - prefix: "268", - }, - { - iso2: "SE", - name: "Sweden", - prefix: "46", - }, - { - iso2: "CH", - name: "Switzerland", - prefix: "41", - }, - { - iso2: "SY", - name: "Syria", - prefix: "963", - }, - { - iso2: "ST", - name: "S\u00e3o Tom\u00e9 & Pr\u00edncipe", - prefix: "239", - }, - { - iso2: "TW", - name: "Taiwan", - prefix: "886", - }, - { - iso2: "TJ", - name: "Tajikistan", - prefix: "992", - }, - { - iso2: "TZ", - name: "Tanzania", - prefix: "255", - }, - { - iso2: "TH", - name: "Thailand", - prefix: "66", - }, - { - iso2: "TL", - name: "Timor-Leste", - prefix: "670", - }, - { - iso2: "TG", - name: "Togo", - prefix: "228", - }, - { - iso2: "TK", - name: "Tokelau", - prefix: "690", - }, - { - iso2: "TO", - name: "Tonga", - prefix: "676", - }, - { - iso2: "TT", - name: "Trinidad & Tobago", - prefix: "1", - }, - { - iso2: "TN", - name: "Tunisia", - prefix: "216", - }, - { - iso2: "TR", - name: "Turkey", - prefix: "90", - }, - { - iso2: "TM", - name: "Turkmenistan", - prefix: "993", - }, - { - iso2: "TC", - name: "Turks & Caicos Islands", - prefix: "1", - }, - { - iso2: "TV", - name: "Tuvalu", - prefix: "688", - }, - { - iso2: "VI", - name: "U.S. Virgin Islands", - prefix: "1", - }, - { - iso2: "UG", - name: "Uganda", - prefix: "256", - }, - { - iso2: "UA", - name: "Ukraine", - prefix: "380", - }, - { - iso2: "AE", - name: "United Arab Emirates", - prefix: "971", - }, - { - iso2: "UY", - name: "Uruguay", - prefix: "598", - }, - { - iso2: "UZ", - name: "Uzbekistan", - prefix: "998", - }, - { - iso2: "VU", - name: "Vanuatu", - prefix: "678", - }, - { - iso2: "VA", - name: "Vatican City", - prefix: "39", - }, - { - iso2: "VE", - name: "Venezuela", - prefix: "58", - }, - { - iso2: "VN", - name: "Vietnam", - prefix: "84", - }, - { - iso2: "WF", - name: "Wallis & Futuna", - prefix: "681", - }, - { - iso2: "EH", - name: "Western Sahara", - prefix: "212", - }, - { - iso2: "YE", - name: "Yemen", - prefix: "967", - }, - { - iso2: "ZM", - name: "Zambia", - prefix: "260", - }, - { - iso2: "ZW", - name: "Zimbabwe", - prefix: "263", - }, -]; diff --git a/packages/editor/src/app/matrix-auth/auth/util/verifyServerConfig.ts b/packages/editor/src/app/matrix-auth/auth/util/verifyServerConfig.ts deleted file mode 100644 index f0dcb02bd..000000000 --- a/packages/editor/src/app/matrix-auth/auth/util/verifyServerConfig.ts +++ /dev/null @@ -1,118 +0,0 @@ -import AutoDiscoveryUtils, { - ValidatedServerConfig, -} from "./AutoDiscoveryUtils"; -import { AutoDiscovery } from "matrix-js-sdk"; -// from -export async function verifyServerConfig(config: any) { - let validatedConfig: ValidatedServerConfig; - try { - console.log("Verifying homeserver configuration"); - - // Note: the query string may include is_url and hs_url - we only respect these in the - // context of email validation. Because we don't respect them otherwise, we do not need - // to parse or consider them here. - - // Note: Although we throw all 3 possible configuration options through a .well-known-style - // verification, we do not care if the servers are online at this point. We do moderately - // care if they are syntactically correct though, so we shove them through the .well-known - // validators for that purpose. - - // const config = SdkConfig.get(); - let wkConfig = config["default_server_config"]; // overwritten later under some conditions - const serverName = config["default_server_name"]; - const hsUrl = config["default_hs_url"]; - const isUrl = config["default_is_url"]; - - const incompatibleOptions = [wkConfig, serverName, hsUrl].filter( - (i) => !!i - ); - if (incompatibleOptions.length > 1) { - // noinspection ExceptionCaughtLocallyJS - throw new Error( - "Invalid configuration: can only specify one of default_server_config, default_server_name, " + - "or default_hs_url." - ); - } - if (incompatibleOptions.length < 1) { - // noinspection ExceptionCaughtLocallyJS - throw Error("Invalid configuration: no default server specified."); - } - - if (hsUrl) { - console.log( - "Config uses a default_hs_url - constructing a default_server_config using this information" - ); - console.warn( - "DEPRECATED CONFIG OPTION: In the future, default_hs_url will not be accepted. Please use " + - "default_server_config instead." - ); - - wkConfig = { - "m.homeserver": { - base_url: hsUrl, - }, - }; - if (isUrl) { - wkConfig["m.identity_server"] = { - base_url: isUrl, - }; - } - } - - let discoveryResult = null; - if (wkConfig) { - console.log("Config uses a default_server_config - validating object"); - discoveryResult = await AutoDiscovery.fromDiscoveryConfig(wkConfig); - // throw new Error("not supported"); - } - - if (serverName) { - console.log( - "Config uses a default_server_name - doing .well-known lookup" - ); - console.warn( - "DEPRECATED CONFIG OPTION: In the future, default_server_name will not be accepted. Please " + - "use default_server_config instead." - ); - discoveryResult = await AutoDiscovery.findClientConfig(serverName); - // throw new Error("not supported"); - } - - validatedConfig = AutoDiscoveryUtils.buildValidatedConfigFromDiscovery( - serverName, - discoveryResult, - true - ); - } catch (e) { - /* - const { hsUrl, isUrl, userId } = await Lifecycle.getStoredSessionVars(); - if (hsUrl && userId) { - console.error(e); - console.warn( - "A session was found - suppressing config error and using the session's homeserver" - ); - - console.log("Using pre-existing hsUrl and isUrl: ", { hsUrl, isUrl }); - validatedConfig = - await AutoDiscoveryUtils.validateServerConfigWithStaticUrls( - hsUrl, - isUrl, - true - ); - } else {*/ - // the user is not logged in, so scream - throw e; - // } - } - - validatedConfig.isDefault = true; - - // Just in case we ever have to debug this - console.log("Using homeserver config:", validatedConfig); - - // Add the newly built config to the actual config for use by the app - console.log("Updating SdkConfig with validated discovery information"); - // SdkConfig.add({ validated_server_config: validatedConfig }); - - return validatedConfig; //SdkConfig.get(); -} diff --git a/packages/editor/src/app/matrix-auth/auth/views/CaptchaForm.tsx b/packages/editor/src/app/matrix-auth/auth/views/CaptchaForm.tsx deleted file mode 100644 index 5a80f7b44..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/CaptchaForm.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* -Copyright 2015, 2016 OpenMarket Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; - -const DIV_ID = "mx_recaptcha"; - -type Props = { - sitePublicKey: string; - onCaptchaResponse: (response: any) => void; -}; - -type State = { - errorText: undefined | string; -}; - -/** - * A pure UI component which displays a captcha form. - */ -export default class CaptchaForm extends React.Component { - private _captchaWidgetId: string | undefined; - private _recaptchaContainer = React.createRef(); - constructor(props: Props) { - super(props); - - this.state = { - errorText: undefined, - }; - } - - componentDidMount() { - // Just putting a script tag into the returned jsx doesn't work, annoyingly, - // so we do this instead. - if ((global as any).grecaptcha) { - // already loaded - this._onCaptchaLoaded(); - } else { - console.log("Loading recaptcha script..."); - (window as any).mx_on_recaptcha_loaded = () => { - this._onCaptchaLoaded(); - }; - const scriptTag = document.createElement("script"); - scriptTag.setAttribute( - "src", - `https://www.recaptcha.net/recaptcha/api.js?onload=mx_on_recaptcha_loaded&render=explicit` - ); - this._recaptchaContainer.current!.appendChild(scriptTag); - } - } - - componentWillUnmount() { - this._resetRecaptcha(); - } - - _renderRecaptcha(divId: string) { - if (!(global as any).grecaptcha) { - console.error("grecaptcha not loaded!"); - throw new Error("Recaptcha did not load successfully"); - } - - const publicKey = this.props.sitePublicKey; - if (!publicKey) { - console.error("No public key for recaptcha!"); - throw new Error( - "This server has not supplied enough information for Recaptcha " + - "authentication" - ); - } - - console.info("Rendering to %s", divId); - this._captchaWidgetId = (global as any).grecaptcha.render(divId, { - sitekey: publicKey, - callback: this.props.onCaptchaResponse, - }); - } - - _resetRecaptcha() { - if (this._captchaWidgetId !== undefined) { - (global as any).grecaptcha.reset(this._captchaWidgetId); - } - } - - _onCaptchaLoaded() { - console.log("Loaded recaptcha script."); - try { - this._renderRecaptcha(DIV_ID); - // clear error if re-rendered - this.setState({ - errorText: undefined, - }); - } catch (e: any) { - this.setState({ - errorText: e.toString(), - }); - } - } - - render() { - let error = null; - if (this.state.errorText) { - error =
{this.state.errorText}
; - } - - return ( -
-

Let's make sure you're not a robot:

-
- {error} -
- ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/views/CompleteSecurityBody.tsx b/packages/editor/src/app/matrix-auth/auth/views/CompleteSecurityBody.tsx deleted file mode 100644 index f0f68df44..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/CompleteSecurityBody.tsx +++ /dev/null @@ -1,23 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; - -export const CompleteSecurityBody = (props: { children: any }) => { - return
{props.children}
; -}; - -export default CompleteSecurityBody; diff --git a/packages/editor/src/app/matrix-auth/auth/views/CountryDropdown.tsx.bak b/packages/editor/src/app/matrix-auth/auth/views/CountryDropdown.tsx.bak deleted file mode 100644 index 784f92ba9..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/CountryDropdown.tsx.bak +++ /dev/null @@ -1,168 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import PropTypes from "prop-types"; - -import { COUNTRIES, getEmojiFlag } from "../util/phonenumber"; - -const COUNTRIES_BY_ISO2: any = {}; -for (const c of COUNTRIES) { - COUNTRIES_BY_ISO2[c.iso2] = c; -} - -function countryMatchesSearchQuery(query: string, country: Country) { - // Remove '+' if present (when searching for a prefix) - if (query[0] === "+") { - query = query.slice(1); - } - - if (country.name.toUpperCase().indexOf(query.toUpperCase()) == 0) return true; - if (country.iso2 == query.toUpperCase()) return true; - if (country.prefix.indexOf(query) !== -1) return true; - return false; -} - -type Props = { - className: string; - isSmall: boolean; - // if isSmall, show +44 in the selected value - showPrefix: boolean; - onOptionChange: (country: Country) => void; - value: string; - disabled: boolean; -}; - -type State = { - searchQuery: string; - defaultCountry: Country; -}; - -export default class CountryDropdown extends React.Component { - constructor(props: Props) { - super(props); - this._onSearchChange = this._onSearchChange.bind(this); - this._onOptionChange = this._onOptionChange.bind(this); - this._getShortOption = this._getShortOption.bind(this); - - let defaultCountry = COUNTRIES[0]; - // const defaultCountryCode = SdkConfig.get()["defaultCountryCode"]; - const defaultCountryCode = "US"; - if (defaultCountryCode) { - const country = COUNTRIES.find( - (c) => c.iso2 === defaultCountryCode.toUpperCase() - ); - if (country) defaultCountry = country; - } - - this.state = { - searchQuery: "", - defaultCountry, - }; - } - - componentDidMount() { - if (!this.props.value) { - // If no value is given, we start with the default - // country selected, but our parent component - // doesn't know this, therefore we do this. - this.props.onOptionChange(this.state.defaultCountry); - } - } - - _onSearchChange(search: string) { - this.setState({ - searchQuery: search, - }); - } - - _onOptionChange(iso2: string) { - this.props.onOptionChange(COUNTRIES_BY_ISO2[iso2]); - } - - _flagImgForIso2(iso2: string) { - return
{getEmojiFlag(iso2)}
; - } - - _getShortOption(iso2: string) { - if (!this.props.isSmall) { - return undefined; - } - let countryPrefix; - if (this.props.showPrefix) { - countryPrefix = "+" + COUNTRIES_BY_ISO2[iso2].prefix; - } - return ( - - {this._flagImgForIso2(iso2)} - {countryPrefix} - - ); - } - - render() { - const Dropdown = sdk.getComponent("elements.Dropdown"); - - let displayedCountries; - if (this.state.searchQuery) { - displayedCountries = COUNTRIES.filter( - countryMatchesSearchQuery.bind(this, this.state.searchQuery) - ); - if ( - this.state.searchQuery.length == 2 && - COUNTRIES_BY_ISO2[this.state.searchQuery.toUpperCase()] - ) { - // exact ISO2 country name match: make the first result the matches ISO2 - const matched = COUNTRIES_BY_ISO2[this.state.searchQuery.toUpperCase()]; - displayedCountries = displayedCountries.filter((c) => { - return c.iso2 != matched.iso2; - }); - displayedCountries.unshift(matched); - } - } else { - displayedCountries = COUNTRIES; - } - - const options = displayedCountries.map((country) => { - return ( -
- {this._flagImgForIso2(country.iso2)} - {country.name} (+{country.prefix}) -
- ); - }); - - // default value here too, otherwise we need to handle null / undefined - // values between mounting and the initial value propgating - const value = this.props.value || this.state.defaultCountry.iso2; - - return ( - - {options} - - ); - } -} diff --git a/packages/editor/src/app/matrix-auth/auth/views/InteractiveAuthEntryComponents.tsx b/packages/editor/src/app/matrix-auth/auth/views/InteractiveAuthEntryComponents.tsx deleted file mode 100644 index 644665398..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/InteractiveAuthEntryComponents.tsx +++ /dev/null @@ -1,954 +0,0 @@ -/* -Copyright 2016 OpenMarket Ltd -Copyright 2017 Vector Creations Ltd -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import Button from "@atlaskit/button"; -import { Checkbox } from "@atlaskit/checkbox"; -import SectionMessage from "@atlaskit/section-message"; -import classnames from "classnames"; -import PropTypes from "prop-types"; -import React, { createRef, FormEvent } from "react"; -import AccessibleButton from "../elements/AccessibleButton"; -import Field from "../elements/Field"; -import Spinner from "../elements/Spinner"; -import CaptchaForm from "./CaptchaForm"; - -/* This file contains a collection of components which are used by the - * InteractiveAuth to prompt the user to enter the information needed - * for an auth stage. (The intention is that they could also be used for other - * components, such as the registration flow). - * - * Call getEntryComponentForLoginType() to get a component suitable for a - * particular login type. Each component requires the same properties: - * - * matrixClient: A matrix client. May be a different one to the one - * currently being used generally (eg. to register with - * one HS whilst beign a guest on another). - * loginType: the login type of the auth stage being attempted - * authSessionId: session id from the server - * clientSecret: The client secret in use for ID server auth sessions - * stageParams: params from the server for the stage being attempted - * errorText: error message from a previous attempt to authenticate - * submitAuthDict: a function which will be called with the new auth dict - * busy: a boolean indicating whether the auth logic is doing something - * the user needs to wait for. - * inputs: Object of inputs provided by the user, as in js-sdk - * interactive-auth - * stageState: Stage-specific object used for communicating state information - * to the UI from the state-specific auth logic. - * Defined keys for stages are: - * m.login.email.identity: - * * emailSid: string representing the sid of the active - * verification session from the ID server, or - * null if no session is active. - * fail: a function which should be called with an error object if an - * error occurred during the auth stage. This will cause the auth - * session to be failed and the process to go back to the start. - * setEmailSid: m.login.email.identity only: a function to be called with the - * email sid after a token is requested. - * onPhaseChange: A function which is called when the stage's phase changes. If - * the stage has no phases, call this with DEFAULT_PHASE. Takes - * one argument, the phase, and is always defined/required. - * continueText: For stages which have a continue button, the text to use. - * continueKind: For stages which have a continue button, the style of button to - * use. For example, 'danger' or 'primary'. - * onCancel A function with no arguments which is called by the stage if the - * user knowingly cancelled/dismissed the authentication attempt. - * - * Each component may also provide the following functions (beyond the standard React ones): - * focus: set the input focus appropriately in the form. - */ - -export const DEFAULT_PHASE = 0; - -type PasswordAuthEntryProps = { - matrixClient: any; - submitAuthDict: (authDict: any) => void; - errorText: string; - // is the auth logic currently waiting for something to - // happen? - busy: boolean; - onPhaseChange: (phase: number) => void; -}; -export class PasswordAuthEntry extends React.Component { - static LOGIN_TYPE = "m.login.password"; - - static propTypes = { - matrixClient: PropTypes.object.isRequired, - submitAuthDict: PropTypes.func.isRequired, - errorText: PropTypes.string, - // is the auth logic currently waiting for something to - // happen? - busy: PropTypes.bool, - onPhaseChange: PropTypes.func.isRequired, - }; - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - } - - state = { - password: "", - }; - - _onSubmit = (e: FormEvent) => { - e.preventDefault(); - if (this.props.busy) return; - - this.props.submitAuthDict({ - type: PasswordAuthEntry.LOGIN_TYPE, - // TODO: Remove `user` once servers support proper UIA - // See https://github.com/vector-im/element-web/issues/10312 - user: this.props.matrixClient.credentials.userId, - identifier: { - type: "m.id.user", - user: this.props.matrixClient.credentials.userId, - }, - password: this.state.password, - }); - }; - - _onPasswordFieldChange = (ev: React.ChangeEvent) => { - // enable the submit button iff the password is non-empty - this.setState({ - password: ev.target.value, - }); - }; - - render() { - const passwordBoxClass = classnames({ - error: this.props.errorText, - }); - - let submitButtonOrSpinner; - if (this.props.busy) { - submitButtonOrSpinner = ; - } else { - submitButtonOrSpinner = ( - - ); - } - - let errorSection; - if (this.props.errorText) { - errorSection = ( -
- {this.props.errorText} -
- ); - } - - return ( - // TODO: Change this to be compatible with Atlaskit Form - // This form uses the old structure of forms, which has been - // replaced by Atlaskit Form's. See mainly Fields.tsx -
-

Confirm your identity by entering your account password below.

-
- -
{submitButtonOrSpinner}
- - {errorSection} -
- ); - } -} - -type RecaptchaAuthEntryProps = { - submitAuthDict: (authDict: any) => void; - stageParams: any; - errorText: string; - busy: boolean; - onPhaseChange: (phase: number) => void; -}; - -export class RecaptchaAuthEntry extends React.Component { - static LOGIN_TYPE = "m.login.recaptcha"; - - static propTypes = { - submitAuthDict: PropTypes.func.isRequired, - stageParams: PropTypes.object.isRequired, - errorText: PropTypes.string, - busy: PropTypes.bool, - onPhaseChange: PropTypes.func.isRequired, - }; - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - } - - _onCaptchaResponse = (response: any) => { - this.props.submitAuthDict({ - type: RecaptchaAuthEntry.LOGIN_TYPE, - response: response, - }); - }; - - render() { - if (this.props.busy) { - return ; - } - - let errorText = this.props.errorText; - - let sitePublicKey; - if (!this.props.stageParams || !this.props.stageParams.public_key) { - errorText = - "Missing captcha public key in homeserver configuration. Please report " + - "this to your homeserver administrator."; - } else { - sitePublicKey = this.props.stageParams.public_key; - } - - let errorSection; - if (errorText) { - errorSection = ( -
- {errorText} -
- ); - } - - return ( -
- - {errorSection} -
- ); - } -} - -type LangPolicy = { - name: string; - url: string; - id: string | undefined; -}; - -type Policy = { - [lang: string]: LangPolicy; -}; -type TermsAuthEntryProps = { - submitAuthDict: (authDict: any) => void; - stageParams: { - policies: { - [policy: string]: Policy; - }; - }; - errorText: string; - busy: boolean; - showContinue: boolean; - onPhaseChange: (phase: number) => void; -}; - -type TermsAuthEntryState = { - toggledPolicies: { - [id: string]: boolean; - }; - policies: LangPolicy[]; - errorText?: string; -}; - -export class TermsAuthEntry extends React.Component< - TermsAuthEntryProps, - TermsAuthEntryState -> { - static LOGIN_TYPE = "m.login.terms"; - - static propTypes = { - submitAuthDict: PropTypes.func.isRequired, - stageParams: PropTypes.object.isRequired, - errorText: PropTypes.string, - busy: PropTypes.bool, - showContinue: PropTypes.bool, - onPhaseChange: PropTypes.func.isRequired, - }; - - constructor(props: TermsAuthEntryProps) { - super(props); - - // example stageParams: - // - // { - // "policies": { - // "privacy_policy": { - // "version": "1.0", - // "en": { - // "name": "Privacy Policy", - // "url": "https://example.org/privacy-1.0-en.html", - // }, - // "fr": { - // "name": "Politique de confidentialité", - // "url": "https://example.org/privacy-1.0-fr.html", - // }, - // }, - // "other_policy": { ... }, - // } - // } - - const allPolicies = this.props.stageParams.policies || {}; - const prefLang = "en"; // SettingsStore.getValue("language"); - const initToggles: any = {}; - const pickedPolicies = []; - for (const policyId of Object.keys(allPolicies)) { - const policy = allPolicies[policyId]; - - // Pick a language based on the user's language, falling back to english, - // and finally to the first language available. If there's still no policy - // available then the homeserver isn't respecting the spec. - let langPolicy = policy[prefLang]; - if (!langPolicy) langPolicy = policy["en"]; - if (!langPolicy) { - // last resort - const firstLang = Object.keys(policy).find((e) => e !== "version"); - langPolicy = policy[firstLang!]; - } - if (!langPolicy) - throw new Error("Failed to find a policy to show the user"); - - initToggles[policyId] = false; - - langPolicy.id = policyId; - pickedPolicies.push(langPolicy); - } - - this.state = { - toggledPolicies: initToggles, - policies: pickedPolicies, - }; - } - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - } - - tryContinue = () => { - this._trySubmit(); - }; - - _togglePolicy(policyId: string) { - const newToggles: TermsAuthEntryState["toggledPolicies"] = {}; - for (const policy of this.state.policies) { - let checked = this.state.toggledPolicies[policy.id!]; - if (policy.id === policyId) checked = !checked; - - newToggles[policy.id!] = checked; - } - this.setState({ toggledPolicies: newToggles }); - } - - _trySubmit = () => { - let allChecked = true; - for (const policy of this.state.policies) { - const checked = this.state.toggledPolicies[policy.id!]; - allChecked = allChecked && checked; - } - - if (allChecked) { - this.props.submitAuthDict({ type: TermsAuthEntry.LOGIN_TYPE }); - } else { - this.setState({ - errorText: "Please review and accept all of the homeserver's policies", - }); - } - }; - - render() { - if (this.props.busy) { - return ; - } - - const checkboxes = []; - let allChecked = true; - for (const policy of this.state.policies) { - const checked = this.state.toggledPolicies[policy.id!]; - allChecked = allChecked && checked; - - checkboxes.push( -
- this._togglePolicy(policy.id!)} - label={ - - {policy.name} - - } - /> -
- ); - } - - let errorSection: any; - if (this.props.errorText || this.state.errorText) { - errorSection = ( - -

{this.props.errorText || this.state.errorText}

-
- ); - } - - let submitButton: any; - if (this.props.showContinue !== false) { - // XXX: button classes - submitButton = ( - - ); - } - - return ( -
-

Please review and accept the policies of this homeserver:

- {checkboxes} - {errorSection} - {submitButton} -
- ); - } -} - -type EmailIdentityAuthEntryProps = { - submitAuthDict: (authDict: any) => void; - onPhaseChange: (phase: number) => void; - inputs: any; - stageState: any; -}; -export class EmailIdentityAuthEntry extends React.Component { - static LOGIN_TYPE = "m.login.email.identity"; - - static propTypes = { - matrixClient: PropTypes.object.isRequired, - submitAuthDict: PropTypes.func.isRequired, - authSessionId: PropTypes.string.isRequired, - clientSecret: PropTypes.string.isRequired, - inputs: PropTypes.object.isRequired, - stageState: PropTypes.object.isRequired, - fail: PropTypes.func.isRequired, - setEmailSid: PropTypes.func.isRequired, - onPhaseChange: PropTypes.func.isRequired, - }; - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - } - - render() { - // This component is now only displayed once the token has been requested, - // so we know the email has been sent. It can also get loaded after the user - // has clicked the validation link if the server takes a while to propagate - // the validation internally. If we're in the session spawned from clicking - // the validation link, we won't know the email address, so if we don't have it, - // assume that the link has been clicked and the server will realise when we poll. - if (this.props.inputs.emailAddress === undefined) { - return ; - } else if (this.props.stageState?.emailSid) { - // we only have a session ID if the user has clicked the link in their email, - // so show a loading state instead of "an email has been sent to..." because - // that's confusing when you've already read that email. - return ; - } else { - return ( -
-

- A confirmation email has been sent to{" "} - {this.props.inputs.emailAddress} -

-

Open the link in the email to continue registration.

-
- ); - } - } -} - -type MsisdnAuthEntryProps = { - submitAuthDict: (authDict: any) => void; - onPhaseChange: (phase: number) => void; - inputs: any; - stageState: any; - matrixClient: any; - clientSecret: string; - fail: (e: any) => void; -}; - -type MsisdnAuthEntryState = { - errorText?: string; - token: string; - requestingToken: boolean; -}; - -export class MsisdnAuthEntry extends React.Component< - MsisdnAuthEntryProps, - MsisdnAuthEntryState -> { - private _submitUrl: string | null = null; - private _sid: string | null = null; - private _msisdn: string | null = null; - private _tokenBox: string | null = null; - - static LOGIN_TYPE = "m.login.msisdn"; - - static propTypes = { - inputs: PropTypes.shape({ - phoneCountry: PropTypes.string, - phoneNumber: PropTypes.string, - }), - fail: PropTypes.func, - clientSecret: PropTypes.func, - submitAuthDict: PropTypes.func.isRequired, - matrixClient: PropTypes.object, - onPhaseChange: PropTypes.func.isRequired, - }; - - state = { - token: "", - requestingToken: false, - errorText: undefined, - }; - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - - this._submitUrl = null; - this._sid = null; - this._msisdn = null; - this._tokenBox = null; - - this.setState({ requestingToken: true }); - this._requestMsisdnToken() - .catch((e: any) => { - this.props.fail(e); - }) - .finally(() => { - this.setState({ requestingToken: false }); - }); - } - - /* - * Requests a verification token by SMS. - */ - _requestMsisdnToken() { - return this.props.matrixClient - .requestRegisterMsisdnToken( - this.props.inputs.phoneCountry, - this.props.inputs.phoneNumber, - this.props.clientSecret, - 1 // TODO: Multiple send attempts? - ) - .then((result: any) => { - this._submitUrl = result.submit_url; - this._sid = result.sid; - this._msisdn = result.msisdn; - }); - } - - _onTokenChange = (e: React.ChangeEvent) => { - this.setState({ - token: e.target.value, - }); - }; - - _onFormSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - if (this.state.token === "") return; - - this.setState({ - errorText: undefined, - }); - - try { - let result; - if (this._submitUrl) { - result = await this.props.matrixClient.submitMsisdnTokenOtherUrl( - this._submitUrl, - this._sid, - this.props.clientSecret, - this.state.token - ); - } else { - throw new Error("The registration with MSISDN flow is misconfigured"); - } - if (result.success) { - const creds = { - sid: this._sid, - client_secret: this.props.clientSecret, - }; - this.props.submitAuthDict({ - type: MsisdnAuthEntry.LOGIN_TYPE, - // TODO: Remove `threepid_creds` once servers support proper UIA - // See https://github.com/vector-im/element-web/issues/10312 - // See https://github.com/matrix-org/matrix-doc/issues/2220 - threepid_creds: creds, - threepidCreds: creds, - }); - } else { - this.setState({ - errorText: "Token incorrect", - }); - } - } catch (e) { - this.props.fail(e); - console.log("Failed to submit msisdn token"); - } - }; - - render() { - if (this.state.requestingToken) { - return ; - } else { - const enableSubmit = Boolean(this.state.token); - const submitClasses = classnames({ - mx_InteractiveAuthEntryComponents_msisdnSubmit: true, - mx_GeneralButton: true, - }); - let errorSection; - if (this.state.errorText) { - errorSection = ( -
- {this.state.errorText} -
- ); - } - return ( -
-

- A text message has been sent to {this._msisdn} -

-

Please enter the code it contains:

-
-
- -
- -
- {errorSection} -
-
- ); - } - } -} - -type SSOAuthEntryProps = { - submitAuthDict: (authDict: any) => void; - onPhaseChange: (phase: number) => void; - stageState: any; - matrixClient: any; - loginType: string; - authSessionId: string; - continueKind?: string; - continueText?: string; - errorText?: string; - onCancel: () => void; -}; - -type SSOAuthEntryState = { - phase: number; - attemptFailed: boolean; -}; - -export class SSOAuthEntry extends React.Component< - SSOAuthEntryProps, - SSOAuthEntryState -> { - static propTypes = { - matrixClient: PropTypes.object.isRequired, - authSessionId: PropTypes.string.isRequired, - loginType: PropTypes.string.isRequired, - submitAuthDict: PropTypes.func.isRequired, - errorText: PropTypes.string, - onPhaseChange: PropTypes.func.isRequired, - continueText: PropTypes.string, - continueKind: PropTypes.string, - onCancel: PropTypes.func, - }; - - static LOGIN_TYPE = "m.login.sso"; - static UNSTABLE_LOGIN_TYPE = "org.matrix.login.sso"; - - static PHASE_PREAUTH = 1; // button to start SSO - static PHASE_POSTAUTH = 2; // button to confirm SSO completed - - private _popupWindow: Window | undefined; - _ssoUrl: string; - - constructor(props: SSOAuthEntryProps) { - super(props); - - // We actually send the user through fallback auth so we don't have to - // deal with a redirect back to us, losing application context. - this._ssoUrl = props.matrixClient.getFallbackAuthUrl( - this.props.loginType, - this.props.authSessionId - ); - - this._popupWindow = undefined; - window.addEventListener("message", this._onReceiveMessage); - - this.state = { - phase: SSOAuthEntry.PHASE_PREAUTH, - attemptFailed: false, - }; - } - - componentDidMount(): void { - this.props.onPhaseChange(SSOAuthEntry.PHASE_PREAUTH); - } - - componentWillUnmount() { - window.removeEventListener("message", this._onReceiveMessage); - if (this._popupWindow) { - this._popupWindow.close(); - this._popupWindow = undefined; - } - } - - attemptFailed = () => { - this.setState({ - attemptFailed: true, - }); - }; - - _onReceiveMessage = (event: { data: string; origin: string }) => { - if ( - event.data === "authDone" && - event.origin === this.props.matrixClient.getHomeserverUrl() - ) { - if (this._popupWindow) { - this._popupWindow.close(); - this._popupWindow = undefined; - } - } - }; - - onStartAuthClick = () => { - // Note: We don't use PlatformPeg's startSsoAuth functions because we almost - // certainly will need to open the thing in a new tab to avoid losing application - // context. - - this._popupWindow = window.open(this._ssoUrl, "_blank") || undefined; - this.setState({ phase: SSOAuthEntry.PHASE_POSTAUTH }); - this.props.onPhaseChange(SSOAuthEntry.PHASE_POSTAUTH); - }; - - onConfirmClick = () => { - this.props.submitAuthDict({}); - }; - - render() { - let continueButton = null; - const cancelButton = ( - - Cancel - - ); - if (this.state.phase === SSOAuthEntry.PHASE_PREAUTH) { - continueButton = ( - - {this.props.continueText || "Single Sign On"} - - ); - } else { - continueButton = ( - - {this.props.continueText || "Confirm"} - - ); - } - - let errorSection; - if (this.props.errorText) { - errorSection = ( -
- {this.props.errorText} -
- ); - } else if (this.state.attemptFailed) { - errorSection = ( -
- Something went wrong in confirming your identity. Cancel and try - again. -
- ); - } - - return ( - - {errorSection} -
- {cancelButton} - {continueButton} -
-
- ); - } -} - -type FallbackAuthEntryProps = { - matrixClient: any; - authSessionId: string; - loginType: string; - submitAuthDict: (dict: any) => void; - errorText: string; - onPhaseChange: (phase: number) => void; -}; - -export class FallbackAuthEntry extends React.Component { - static propTypes = { - matrixClient: PropTypes.object.isRequired, - authSessionId: PropTypes.string.isRequired, - loginType: PropTypes.string.isRequired, - submitAuthDict: PropTypes.func.isRequired, - errorText: PropTypes.string, - onPhaseChange: PropTypes.func.isRequired, - }; - - // we have to make the user click a button, as browsers will block - // the popup if we open it immediately. - private _popupWindow: Window | undefined; - private _fallbackButton = createRef(); - constructor(props: FallbackAuthEntryProps) { - super(props); - - window.addEventListener("message", this._onReceiveMessage); - } - - componentDidMount() { - this.props.onPhaseChange(DEFAULT_PHASE); - } - - componentWillUnmount() { - window.removeEventListener("message", this._onReceiveMessage); - if (this._popupWindow) { - this._popupWindow.close(); - } - } - - focus = () => { - if (this._fallbackButton.current) { - this._fallbackButton.current.focus(); - } - }; - - _onShowFallbackClick = (e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - - const url = this.props.matrixClient.getFallbackAuthUrl( - this.props.loginType, - this.props.authSessionId - ); - this._popupWindow = window.open(url, "_blank") || undefined; - }; - - _onReceiveMessage = (event: { data: string; origin: string }) => { - if ( - event.data === "authDone" && - event.origin === this.props.matrixClient.getHomeserverUrl() - ) { - this.props.submitAuthDict({}); - } - }; - - render() { - let errorSection; - if (this.props.errorText) { - errorSection = ( -
- {this.props.errorText} -
- ); - } - - return ( -
- {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */} - - {"Start authentication"} - - {errorSection} -
- ); - } -} - -const AuthEntryComponents = [ - PasswordAuthEntry, - RecaptchaAuthEntry, - EmailIdentityAuthEntry, - MsisdnAuthEntry, - TermsAuthEntry, - SSOAuthEntry, -]; - -export default function getEntryComponentForLoginType(loginType: string) { - for (const c of AuthEntryComponents) { - if ( - c.LOGIN_TYPE === loginType || - (c as any).UNSTABLE_LOGIN_TYPE === loginType - ) { - return c; - } - } - return FallbackAuthEntry; -} diff --git a/packages/editor/src/app/matrix-auth/auth/views/PassphraseField.tsx b/packages/editor/src/app/matrix-auth/auth/views/PassphraseField.tsx deleted file mode 100644 index 019eca4fe..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/PassphraseField.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* -Copyright 2020 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { PureComponent, RefCallback, RefObject } from "react"; -import Field, { IInputProps } from "../elements/Field"; - -interface IProps extends IInputProps { - autoFocus?: boolean; - minScore: 0 | 1 | 2 | 3 | 4; - fieldRef?: RefCallback> | RefObject>; - defaultValue?: string; -} - -class PassphraseField extends PureComponent { - private validate = async (value?: string) => { - if (!value || !value.length) - return { - error: "Add another word or two. Uncommon words are better", - progress: undefined, - }; - - // loaded async because this library is expensive - const { scorePassword } = await import("../util/PasswordScorer"); - - const scoreResults = scorePassword(value); - - if (!scoreResults) { - throw new Error( - "shouldn't be null at this point , as value has been checked for non-emptiness" - ); - } - - if (scoreResults.score && scoreResults.score >= this.props.minScore) { - return { progress: scoreResults.score / 4 }; - } else { - return { - error: - scoreResults.feedback.warning || - scoreResults.feedback.suggestions[0] || - "Keep going...", - progress: scoreResults.score / 4, - }; - } - }; - - render() { - return ( - - ); - } -} - -export default PassphraseField; diff --git a/packages/editor/src/app/matrix-auth/auth/views/PasswordLogin.tsx b/packages/editor/src/app/matrix-auth/auth/views/PasswordLogin.tsx deleted file mode 100644 index cf22fe76d..000000000 --- a/packages/editor/src/app/matrix-auth/auth/views/PasswordLogin.tsx +++ /dev/null @@ -1,315 +0,0 @@ -/* -Copyright 2015, 2016, 2017, 2019 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { LoadingButton } from "@atlaskit/button"; -import Form from "@atlaskit/form"; -import { OptionType } from "@atlaskit/select"; -import React from "react"; -import AuthStyles from "../AuthStyles.module.css"; -import { ButtonEvent } from "../elements/AccessibleButton"; -import Field from "../elements/Field"; -import { ValidatedServerConfig } from "../util/AutoDiscoveryUtils"; -import { looksValidEmail } from "../util/email"; - -// For validating phone numbers without country codes -// const PHONE_NUMBER_REGEX = /^[0-9()\-\s]*$/; - -interface IProps { - defaultUsernameOrEmail: string; - defaultPhoneCountry?: string; - defaultPhoneNumber?: string; - - serverConfig: ValidatedServerConfig; - loginIncorrect?: boolean; - disableSubmit?: boolean; - busy?: boolean; - - onSubmit( - username: string, - phoneCountry: string | undefined, - phoneNumber: string | undefined, - password: string - ): void; - onForgotPasswordClick?(): void; -} - -interface IState { - loginType: LoginField.Email | LoginField.MatrixId | LoginField.Phone; -} - -enum LoginField { - Email = "login_field_email", - MatrixId = "login_field_mxid", - Phone = "login_field_phone", - Password = "login_field_password", -} - -// The type for the form data, represents the structure of the form, -// and also gets passed into the submit handler of the form. -type LoginFormData = { - username?: string; - email?: string; - phoneNumber?: string; - password?: string; -}; - -/* - * A pure UI component which displays a username/password form. - * The email/username/phone fields are fully-controlled, the password field is not. - */ -export default class PasswordLogin extends React.PureComponent { - [LoginField.Email]: Field | null = null; - [LoginField.MatrixId]: Field | null = null; - [LoginField.Phone]: Field | null = null; - [LoginField.Password]: Field | null = null; - - constructor(props: IProps) { - super(props); - this.state = { - loginType: LoginField.Email, - }; - } - - // TODO forgot password is untouched Matrix code - private onForgotPasswordClick = (ev: ButtonEvent) => { - ev.preventDefault(); - ev.stopPropagation(); - this.props.onForgotPasswordClick?.(); - }; - - private onSubmitForm = async (data: LoginFormData) => { - let usernameOrEmail: string = ""; - - const login = this.state.loginType; - - // do field-level validation on fields we only want to validate - // on submission instead of after every event. - if ( - login === LoginField.Email && - data.email && - !looksValidEmail(data.email) - ) { - return { email: "Doesn't look like a valid email address" }; - } - - // set usernameOrEmail to either username or email - if (login === LoginField.MatrixId) { - usernameOrEmail = data.username ? data.username : ""; - } else if (login === LoginField.Email) { - usernameOrEmail = data.email ? data.email : ""; - } - - // TODO: phone signin has yet to be implemented - let phoneCountry: string | undefined; - let phoneNumber: string | undefined; - - const password = data.password ? data.password : ""; - - this.props.onSubmit?.(usernameOrEmail, phoneCountry, phoneNumber, password); - }; - - private onLoginTypeChange = (data: any) => { - const loginType = data.value; - this.setState({ loginType }); - // CountlyAnalytics.instance.track("onboarding_login_type_changed", { - // loginType, - // }); - }; - - private onUsernameValidate = (value?: string) => { - if (!value) { - return { error: "Enter username" }; - } else { - return {}; - } - }; - - private onEmailValidate = (value?: string) => { - if (!value) { - return { error: "Enter email" }; - // } else if (!looksValidEmail(value)) { - // return { error: "Doesn't look like a valid email address" }; - } else { - return {}; - } - }; - - private onPasswordValidate = (value?: string) => { - if (!value) { - return { error: "Enter password" }; - } else { - return {}; - } - }; - - private renderLoginField(loginType: IState["loginType"]) { - const classes = { - error: false, - }; - - switch (loginType) { - case LoginField.Email: - // classes.error = !!this.props.loginIncorrect && !this.props.username; - classes.error = !!this.props.loginIncorrect; - return ( - (this[LoginField.Email] = field)} - /> - ); - case LoginField.MatrixId: - // classes.error = !!this.props.loginIncorrect && !this.props.username; - classes.error = !!this.props.loginIncorrect; - return ( - (this[LoginField.MatrixId] = field)} - /> - ); - - // TODO: Phone signin has yet to be implemented - case LoginField.Phone: { - // classes.error = !!this.props.loginIncorrect && !this.props.phoneNumber; - classes.error = !!this.props.loginIncorrect; - - // const phoneCountry = ( - // - // ); - throw new Error("not implemented"); - // return ( - // (this[LoginField.Password] = field)} - // /> - // ); - } - } - } - - render() { - // let forgotPasswordJsx: any; - - // if (this.props.onForgotPasswordClick) { - // forgotPasswordJsx = ( - // - // ); - // } - - const loginField = this.renderLoginField(this.state.loginType); - - let loginType: any; - //!SdkConfig.get().disable_3pid_login) { - if (true) { - const userNameOption = { label: "Username", value: LoginField.MatrixId }; - const emailOption = { label: "Email address", value: LoginField.Email }; - // const phoneOption = { label: "Phone", value: LoginField.Phone }; - const options = [userNameOption, emailOption]; //, phoneOption]; - // Perhaps this should not be a but just a + */} + + onSubmit={onSubmit}> + {({ formProps, submitting }) => ( +
+ +

+ Welcome to TypeCell! What username would you like to use? +

+
+ + {({ fieldProps, error }) => ( + + + {!error && ( + + You can use letters and numbers + + )} + {error && error === "not-available" && ( + + This username is already in use, try another one. + + )} + {error && error !== "not-available" && ( + + An unknown error occured while registering your + username. + + )} + + )} + + + + {/* */} + + Continue + + + +
+ )} + + + {/* */} + {/*
sdfsdf
*/} +
+
+
+ {/* Powered by Matrix */} +
+ + ); + } +); diff --git a/packages/editor/src/app/main/components/permissions/PermissionsDialog.tsx b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsDialog.tsx similarity index 63% rename from packages/editor/src/app/main/components/permissions/PermissionsDialog.tsx rename to packages/editor/src/app/supabase-auth/routes/permissions/PermissionsDialog.tsx index a4f234cb4..b304ad5f2 100644 --- a/packages/editor/src/app/main/components/permissions/PermissionsDialog.tsx +++ b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsDialog.tsx @@ -1,21 +1,21 @@ import { ModalTransition } from "@atlaskit/modal-dialog"; import { observer } from "mobx-react-lite"; -import React from "react"; -import { DocConnection } from "../../../../store/DocConnection"; -import { getStoreService } from "../../../../store/local/stores"; + +import { Identifier } from "../../../../identifiers/Identifier"; +import { SupabaseSessionStore } from "../../SupabaseSessionStore"; import PermissionsLoader from "./PermissionsLoader"; const PermissionsDialog = observer( (props: { isOpen: boolean; close: () => void; - connection: DocConnection; + identifier: Identifier; + sessionStore: SupabaseSessionStore; }) => { - const sessionStore = getStoreService().sessionStore; - + const { sessionStore } = props; const user = sessionStore.user; if (typeof user === "string" || user.type === "guest-user") { - throw new Error("can't access permissions when not signed in"); + return null; } return ( @@ -23,8 +23,8 @@ const PermissionsDialog = observer( {props.isOpen && ( )} diff --git a/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsLoader.tsx b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsLoader.tsx new file mode 100644 index 000000000..4ff1478e5 --- /dev/null +++ b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsLoader.tsx @@ -0,0 +1,135 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import Modal, { + ModalBody, + ModalHeader, + ModalTitle, +} from "@atlaskit/modal-dialog"; +import Spinner from "@atlaskit/spinner"; +import { observer } from "mobx-react-lite"; +import { useCallback, useEffect, useState } from "react"; +import { Identifier } from "../../../../identifiers/Identifier"; +import { TypeCellIdentifier } from "../../../../identifiers/TypeCellIdentifier"; +import { SupabaseClientType } from "../../SupabaseSessionStore"; +import PermissionSettings from "./PermissionsSettings"; +import styles from "./PermissionsSettings.module.css"; +import { PermissionData, updatePermissionData } from "./permissionUtils"; + +const PermissionsLoader = observer( + (props: { + identifier: Identifier; + user: string | undefined; + supabaseClient: SupabaseClientType; + closeCallback: () => void; + currentUserId: string; + }) => { + if (!(props.identifier instanceof TypeCellIdentifier)) { + throw new Error("unexpected identifier"); + } + const nanoId = props.identifier.documentId; + + const [internalDocId, setInternalDocId] = useState(); + + const [permissionData, setPermissionData] = useState< + PermissionData | undefined + >(); + + const onSave = useCallback( + async (newData: PermissionData) => { + if (!internalDocId || !permissionData) { + throw new Error("unexpected, no internalDocId or permissionData"); + } + await updatePermissionData( + props.supabaseClient, + internalDocId, + permissionData, + newData + ); + }, + [internalDocId, permissionData, props.supabaseClient] + ); + + useEffect(() => { + async function initReader() { + const doc = await props.supabaseClient + .from("documents") + .select("id,public_access_level") + .eq("nano_id", nanoId); + + if (!doc.data || doc.data.length !== 1) { + return; + } + const permissionData = await props.supabaseClient + .from("document_permissions") + .select() + .eq("document_id", doc.data[0].id); + + const usernamesRet = await props.supabaseClient + .from("workspaces") + .select() + .eq("is_username", true) + .in( + "owner_user_id", + permissionData.data?.map((p) => p.user_id) || [] + ); + const usernamesMap = new Map( + usernamesRet.data?.map((d) => [d.owner_user_id, d.name]) + ); + const entries = + permissionData.data?.map( + (u) => + [ + u.user_id!, + { + user: { + id: u.user_id!, + name: "@" + usernamesMap.get(u.user_id!)!, + nameWithoutAtSign: usernamesMap.get(u.user_id!)!, + }, + permission: u.access_level, + }, + ] as const + ) || []; + + setInternalDocId(doc.data[0].id); + setPermissionData({ + doc: doc.data[0].public_access_level, + users: new Map(entries), + }); + } + initReader(); + return () => { + setPermissionData(undefined); + }; + }, [nanoId, props.identifier, props.supabaseClient]); + + if (!permissionData) { + return ( + + + Sharing & Permissions + + +
+ +
+
+
+ ); + } + + return ( + + ); + } +); + +export default PermissionsLoader; diff --git a/packages/editor/src/app/main/components/permissions/PermissionsSettings.module.css b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsSettings.module.css similarity index 100% rename from packages/editor/src/app/main/components/permissions/PermissionsSettings.module.css rename to packages/editor/src/app/supabase-auth/routes/permissions/PermissionsSettings.module.css diff --git a/packages/editor/src/app/main/components/permissions/PermissionsSettings.tsx b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsSettings.tsx similarity index 70% rename from packages/editor/src/app/main/components/permissions/PermissionsSettings.tsx rename to packages/editor/src/app/supabase-auth/routes/permissions/PermissionsSettings.tsx index c767266d0..19e91d188 100644 --- a/packages/editor/src/app/main/components/permissions/PermissionsSettings.tsx +++ b/packages/editor/src/app/supabase-auth/routes/permissions/PermissionsSettings.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import Button, { LoadingButton } from "@atlaskit/button"; import Modal, { ModalBody, @@ -8,35 +9,36 @@ import Modal, { import Select from "@atlaskit/select"; import { observer } from "mobx-react-lite"; import { useState } from "react"; -import { MatrixUserPicker } from "./MatrixUserPicker"; +import { SupabaseClientType } from "../../SupabaseSessionStore"; import styles from "./PermissionsSettings.module.css"; +import UserPermissionRow from "./UserPermissionRow"; +import { SupabaseUserPicker } from "./UserPicker"; import { DocPermission, - docPermissionLabels, PermissionData, - updatePermissionData, - UserPermission, + docPermissionLabels, userPermissionLabels, } from "./permissionUtils"; -import UserPermissionRow from "./UserPermissionRow"; import { User } from "./userUtils"; const PermissionsSettings = observer( (props: { currentUserId: string; - matrixClient: any; - roomId: string; + supabaseClient: SupabaseClientType; + permissionData: PermissionData; - closeCallback: (newPermissionData?: PermissionData) => void; + onSave: (newPermissionData: PermissionData) => void; + closeCallback: () => void; }) => { const [isSaving, setIsSaving] = useState(false); + const [userPickerKey, setUserPickerKey] = useState(() => Math.random()+""); // State for storing & updating the currently selected user from the user picker. const [newUser, setNewUser] = useState(); // State and functions for storing & updating the permission type for the user that is being added. const [newUserPermission, setNewUserPermission] = - useState("edit"); + useState("write"); const [editingPermissionData, setEditingPermissionData] = useState({ @@ -56,22 +58,31 @@ const PermissionsSettings = observer( }); } - function addUserPermission(userId: string, permission: UserPermission) { + function addUserPermission(user: User, permission: DocPermission) { // User already in permissions list. - if (editingPermissionData.users.has(userId)) { + if (editingPermissionData.users.has(user.id)) { return; } - editingPermissionData.users.set(userId, permission); + editingPermissionData.users.set(user.id, { + user, + permission, + }); setEditingPermissionData({ doc: editingPermissionData.doc, users: editingPermissionData.users, }); + + setUserPickerKey(Math.random()+""); } - function editUserPermission(user: string, permission: UserPermission) { - editingPermissionData.users.set(user, permission); + function editUserPermission(userId: string, permission: DocPermission) { + const existingValue = editingPermissionData.users.get(userId); + if (!existingValue) { + throw new Error("editing non existing user permission"); + } + existingValue.permission = permission; setEditingPermissionData({ doc: editingPermissionData.doc, @@ -95,7 +106,7 @@ const PermissionsSettings = observer( function updatePermissionType( value: { label: string; value: string } | null ) { - setNewUserPermission(value!.value as UserPermission); + setNewUserPermission(value!.value as DocPermission); } // Callback for adding a permission. @@ -103,19 +114,14 @@ const PermissionsSettings = observer( if (!newUser) { throw new Error("no user selected"); } - addUserPermission(newUser.id, newUserPermission); + addUserPermission(newUser, newUserPermission); } function save() { setIsSaving(true); (async () => { - await updatePermissionData( - props.matrixClient, - props.roomId, - props.permissionData, - editingPermissionData - ); + await props.onSave(editingPermissionData); setIsSaving(false); props.closeCallback(); @@ -124,7 +130,8 @@ const PermissionsSettings = observer( return ( props.closeCallback()}> Sharing & Permissions @@ -143,25 +150,29 @@ const PermissionsSettings = observer( onChange={updateDocPermission} options={[ { - label: docPermissionLabels.get("public-read-write")!, - value: "public-read-write", + label: docPermissionLabels.get("write")!, + value: "write", }, { - label: docPermissionLabels.get("public-read")!, - value: "public-read", + label: docPermissionLabels.get("read")!, + value: "read", }, { - label: docPermissionLabels.get("private")!, - value: "private", + label: docPermissionLabels.get("no-access")!, + value: "no-access", isDisabled: true, }, ]} /> - {editingPermissionData.doc !== "public-read-write" && ( + {editingPermissionData.doc !== "write" && ( <>
- +
{/*
*/} diff --git a/packages/editor/src/app/supabase-auth/routes/permissions/UserPicker.tsx b/packages/editor/src/app/supabase-auth/routes/permissions/UserPicker.tsx new file mode 100644 index 000000000..6c7cad768 --- /dev/null +++ b/packages/editor/src/app/supabase-auth/routes/permissions/UserPicker.tsx @@ -0,0 +1,77 @@ +import { + AsyncSelect, + LoadingIndicatorProps, + OptionType, +} from "@atlaskit/select"; +import Spinner from "@atlaskit/spinner"; +import { useCallback } from "react"; +import { SupabaseClientType } from "../../SupabaseSessionStore"; +import { User } from "./userUtils"; + +export function SupabaseUserPicker(props: { + // excludeUserId: string; + supabase: SupabaseClientType; + updateSelectedUser: (user: User | undefined) => void; +}) { + const updateSelectedUser = props.updateSelectedUser; + + async function searchUsers(query = "") { + if (query === "") { + return []; + // setDisplayedUsers([]); + } else { + const ret = await props.supabase + .from("workspaces") + .select("*") + .eq("is_username", true) + .ilike("name", query + "%") + .order("name") + .limit(10); + + const results = + ret.data?.map((result) => ({ + label: "@" + result.name, + value: { + id: result.owner_user_id, + name: "@" + result.name, + nameWithoutAtSign: result.name, + }, + // id: result.owner_user_id, + // name: "@" + result.name, + // nameWithoutAtSign: result.name, + })) || []; + return results; + // setDisplayedUsers(results); + } + } + + const onChange = useCallback( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (user: any) => { + if (Array.isArray(user)) { + throw new Error("unexpected"); + } + updateSelectedUser(user?.value || undefined); + }, + [updateSelectedUser] + ); + + const LoadingIndicator = (props: LoadingIndicatorProps) => { + return ; + }; + + return ( + + ); +} diff --git a/packages/editor/src/app/supabase-auth/routes/permissions/permissionUtils.ts b/packages/editor/src/app/supabase-auth/routes/permissions/permissionUtils.ts new file mode 100644 index 000000000..6f513d32b --- /dev/null +++ b/packages/editor/src/app/supabase-auth/routes/permissions/permissionUtils.ts @@ -0,0 +1,102 @@ +import { SupabaseClientType } from "../../SupabaseSessionStore"; +import { User } from "./userUtils"; + +export type DocPermission = "write" | "read" | "no-access"; + +// export type UserPermission = "deny" | "read" | "write"; + +export const docPermissionLabels = new Map([ + ["write", "Anyone can view and edit"], + ["read", "Anyone can view, some can edit"], + ["no-access", "Only some can view or edit (coming in beta)"], +]); + +export const userPermissionLabels = new Map([ + ["read", "Can view"], + ["write", "Can edit"], + ["no-access", "No access"], +]); + +export type PermissionData = { + doc: DocPermission; + users: Map< + string, + { + user: User; + permission: DocPermission; + } + >; +}; + +/** + * Diffs the changes between existing room permission data `old` and + * `newPermissions`. Then applies the changes to the room. + */ +export async function updatePermissionData( + supabaseClient: SupabaseClientType, + internalDocId: string, + old: PermissionData, + newPermissions: PermissionData +) { + if (old.doc !== newPermissions.doc) { + if (newPermissions.doc === "no-access") { + throw new Error("not implemented"); + } + await supabaseClient + .from("documents") + .update({ + public_access_level: newPermissions.doc, + }) + .eq("id", internalDocId) + .order("id") + .limit(1); + } + // if (newPermissions.doc === "public-read-write") { + // // for public documents, the user permissions are irrelevant and don't need to be updated + // return; + // } + + for (const [userId, permission] of old.users) { + const newValue = newPermissions.users.get(userId); + if (!newValue) { + await supabaseClient + .from("document_permissions") + .delete() + .eq("user_id", userId) + .eq("document_id", internalDocId) + .order("document_id,user_id") + .limit(1); + } else if (newValue !== permission) { + await supabaseClient + .from("document_permissions") + .upsert( + { + user_id: userId, + document_id: internalDocId, + access_level: newValue.permission, + }, + { + onConflict: "document_id,user_id", + ignoreDuplicates: false, + } + ) + .order("document_id,user_id") + .limit(1); + } + } + + for (const [userId, permission] of newPermissions.users) { + const oldValue = old.users.get(userId); + if (!oldValue) { + await supabaseClient + .from("document_permissions") + .upsert({ + user_id: userId, + document_id: internalDocId, + access_level: permission.permission, + }) + .order("document_id,user_id") + .limit(1); + } + } +} diff --git a/packages/editor/src/app/main/components/permissions/userUtils.ts b/packages/editor/src/app/supabase-auth/routes/permissions/userUtils.ts similarity index 85% rename from packages/editor/src/app/main/components/permissions/userUtils.ts rename to packages/editor/src/app/supabase-auth/routes/permissions/userUtils.ts index d35e2b308..8cecba5bb 100644 --- a/packages/editor/src/app/main/components/permissions/userUtils.ts +++ b/packages/editor/src/app/supabase-auth/routes/permissions/userUtils.ts @@ -2,6 +2,7 @@ export type User = { // avatarUrl: any, id: string; name: string; + nameWithoutAtSign: string; // type: "user" | "team" | "email" | "group", // fixed: boolean, // lozenge: string diff --git a/packages/editor/src/app/supabase-auth/supabaseAuthProvider.tsx b/packages/editor/src/app/supabase-auth/supabaseAuthProvider.tsx new file mode 100644 index 000000000..d567b7f9f --- /dev/null +++ b/packages/editor/src/app/supabase-auth/supabaseAuthProvider.tsx @@ -0,0 +1,26 @@ +import { Route } from "react-router-dom"; + +import { Login } from "./routes/Login"; +import { Register } from "./routes/Register"; +import { Username } from "./routes/Username"; +import { SupabaseSessionStore } from "./SupabaseSessionStore"; + +export const supabaseAuthProvider = { + routes: { + login: (sessionStore: SupabaseSessionStore) => ( + + ), + register: (sessionStore: SupabaseSessionStore) => ( + + ), + additionalRoutes: (sessionStore: SupabaseSessionStore) => ( + <> + Not implemented yet
} /> + } + /> + + ), + }, +}; diff --git a/packages/editor/src/config/config.ts b/packages/editor/src/config/config.ts index 404627386..0bcc4a2b3 100644 --- a/packages/editor/src/config/config.ts +++ b/packages/editor/src/config/config.ts @@ -1,26 +1,36 @@ import { uri } from "vscode-lib"; +import { env } from "./env"; -const HOMESERVER_URI = uri.URI.parse( - import.meta.env.VITE_REACT_APP_HOMESERVER_URI || "https://mx.typecell.org" +export const DEFAULT_PROVIDER: "matrix" | "supabase" = "supabase"; + +export const DEFAULT_HOMESERVER_URI = uri.URI.parse( + env.VITE_MATRIX_HOMESERVER_URI ); -export const DEFAULT_HOMESERVER_HOST = HOMESERVER_URI.authority; +export const DEFAULT_IDENTIFIER_BASE = + (DEFAULT_PROVIDER as string) === "matrix" + ? uri.URI.from({ + scheme: "mx", + authority: DEFAULT_HOMESERVER_URI.authority, + path: "/", + }) + : uri.URI.from({ + scheme: "typecell", + authority: "typecell.org", + path: "/", + }); + +export const DEFAULT_IDENTIFIER_BASE_STRING = + DEFAULT_IDENTIFIER_BASE.toString().replace("://", ":"); export const MATRIX_CONFIG = { - hsName: import.meta.env.VITE_REACT_APP_HOMESERVER_NAME || "typecell.org", - hsUrl: HOMESERVER_URI.toString(), + hsName: env.VITE_MATRIX_HOMESERVER_NAME, + hsUrl: DEFAULT_HOMESERVER_URI.toString(), + // eslint-disable-next-line @typescript-eslint/no-explicit-any isUrl: undefined as any, // "https://vector.im", defaultDeviceDisplayName: "TypeCell web", }; -export const ENVIRONMENT: "PROD" | "DEV" | "STAGING" | "PREVIEW" = - import.meta.env.VITE_REACT_APP_PREVIEW === "true" - ? "PREVIEW" - : import.meta.env.VITE_REACT_APP_STAGING === "true" - ? "STAGING" - : import.meta.env.PROD - ? "PROD" - : "DEV"; // export const DEFAULT_HOMESERVER_HOST = "matrix-client.matrix.org"; // export const MATRIX_CONFIG = { @@ -32,5 +42,6 @@ export const ENVIRONMENT: "PROD" | "DEV" | "STAGING" | "PREVIEW" = export function getTestFlags(): { disableWebRTC?: boolean; } { + // eslint-disable-next-line @typescript-eslint/no-explicit-any return (window as any).__TEST_OPTIONS || {}; } diff --git a/packages/editor/src/config/env.ts b/packages/editor/src/config/env.ts new file mode 100644 index 000000000..533949e16 --- /dev/null +++ b/packages/editor/src/config/env.ts @@ -0,0 +1,27 @@ +// We need to define the defaults for the dev env here, +// because playwright-test doesn't seem to support .env files +// (https://github.com/hugomrdias/playwright-test/issues/549) +// NOTE: keep in sync with .env.development +const devDefaults = { + VITE_ENVIRONMENT: "development", + VITE_TYPECELL_BACKEND_WS_URL: "ws://localhost:1234", + VITE_TYPECELL_SUPABASE_URL: "http://localhost:54321", + VITE_TYPECELL_SUPABASE_ANON_KEY: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6ImFub24iLCJleHAiOjE5ODM4MTI5OTZ9.CRXP1A7WOeoJeXxjNni43kdQwgnWNReilDMblYTn_I0", + VITE_MATRIX_HOMESERVER_URI: "https://mx.typecell.org", + VITE_MATRIX_HOMESERVER_NAME: "typecell.org", +}; + +const passedInEnv = { + VITE_ENVIRONMENT: import.meta.env?.VITE_ENVIRONMENT, + VITE_TYPECELL_BACKEND_WS_URL: import.meta.env?.VITE_TYPECELL_BACKEND_WS_URL, + VITE_TYPECELL_SUPABASE_URL: import.meta.env?.VITE_TYPECELL_SUPABASE_URL, + VITE_TYPECELL_SUPABASE_ANON_KEY: import.meta.env + ?.VITE_TYPECELL_SUPABASE_ANON_KEY, + VITE_MATRIX_HOMESERVER_URI: import.meta.env?.VITE_MATRIX_HOMESERVER_URI, + VITE_MATRIX_HOMESERVER_NAME: import.meta.env?.VITE_MATRIX_HOMESERVER_NAME, +}; + +export const env = import.meta.env?.VITE_ENVIRONMENT + ? passedInEnv + : devDefaults; diff --git a/packages/editor/src/config/security.ts b/packages/editor/src/config/security.ts index e7ab3b285..9fc2ad654 100644 --- a/packages/editor/src/config/security.ts +++ b/packages/editor/src/config/security.ts @@ -1,5 +1,6 @@ -import { ENVIRONMENT } from "./config"; +import { env } from "./env"; +const ENVIRONMENT = env.VITE_ENVIRONMENT; /* Helper functions to ensure we're loading the application (host) and user-code frame (sandbox) from the correct domains @@ -20,35 +21,49 @@ PROD: export function validateHostDomain() { const hostname = window.location.hostname; - if (ENVIRONMENT === "DEV" || ENVIRONMENT === "PREVIEW") { + if (ENVIRONMENT === "DEV") { return hostname === "localhost"; } if (ENVIRONMENT === "STAGING") { - return hostname.match(/^typecell-next-[A-z0-9-]+-yousefed.vercel.app$/); + return ( + hostname.match(/^typecell-[A-z0-9-]+-typecell.vercel.app$/) || + hostname === "staging.typecell.org" + ); } return ( hostname === "notebooks.typecell.org" || hostname === "www.typecell.org" ); } +export function validateSupabaseConfig() { + if (env.VITE_TYPECELL_SUPABASE_URL.includes("guzxrzrjknsekuefovon")) { + // only allow prod database on prod environment + return ENVIRONMENT === "PROD"; + } + return true; +} + export function validateFrameDomain() { const hostname = window.location.hostname; - if (ENVIRONMENT === "DEV" || ENVIRONMENT === "PREVIEW") { - return hostname === "127.0.0.1"; + if (ENVIRONMENT === "DEV") { + return hostname === "localhost"; + // return hostname === "127.0.0.1"; } if (ENVIRONMENT === "STAGING") { - return hostname.match(/^typecell-next-[A-z0-9-]+-yousefed.vercel.app$/); + return hostname.match(/^typecell-[A-z0-9-]+-typecell.vercel.app$/); } return hostname.match(/^.*\.typescriptrepl\.com$/); } export function getFrameDomain() { - if (ENVIRONMENT === "DEV" || ENVIRONMENT === "PREVIEW") { + if (ENVIRONMENT === "DEV") { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const port = window.location.host.match(/^localhost:(\d+)$/)![1]; - return "127.0.0.1:" + port; + // return "127.0.0.1:" + port; + return "localhost:" + port; } if (ENVIRONMENT === "STAGING") { @@ -59,8 +74,10 @@ export function getFrameDomain() { } export function getMainDomainFromIframe() { - if (ENVIRONMENT === "DEV" || ENVIRONMENT === "PREVIEW") { - const port = window.location.host.match(/^127\.0\.0\.1:(\d+)$/)![1]; + if (ENVIRONMENT === "DEV") { + // const port = window.location.host.match(/^127\.0\.0\.1:(\d+)$/)![1]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const port = window.location.host.match(/^localhost:(\d+)$/)![1]; return "localhost:" + port; } diff --git a/packages/editor/src/identifiers/FileIdentifier.ts b/packages/editor/src/identifiers/FileIdentifier.ts index ed9f00f60..b0d0bb4b3 100644 --- a/packages/editor/src/identifiers/FileIdentifier.ts +++ b/packages/editor/src/identifiers/FileIdentifier.ts @@ -1,26 +1,15 @@ import { uri } from "vscode-lib"; -import { Identifier, stringWithoutInitialSlash } from "./Identifier"; +import { Identifier } from "./Identifier"; export class FileIdentifier extends Identifier { public static schemes = ["fs"]; - public readonly path: string; - - constructor(uriToParse: uri.URI, title?: string) { - let [identifier, subPath] = uriToParse.path.split("/:/", 2); - + constructor(uri: uri.URI) { // call super to drop fragment, query, and make sure path is lowercase - super( - FileIdentifier.schemes, - uri.URI.from({ - scheme: uriToParse.scheme, - authority: uriToParse.authority, - path: identifier, - }), - subPath, - title - ); + super(FileIdentifier.schemes, uri); + } - this.path = stringWithoutInitialSlash(identifier); + public get path() { + return this.uri.path; } } diff --git a/packages/editor/src/identifiers/GithubIdentifier.ts b/packages/editor/src/identifiers/GithubIdentifier.ts index 736af7a50..17b433b1c 100644 --- a/packages/editor/src/identifiers/GithubIdentifier.ts +++ b/packages/editor/src/identifiers/GithubIdentifier.ts @@ -1,5 +1,6 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { uri } from "vscode-lib"; -import { Identifier, stringWithoutInitialSlash } from "./Identifier"; +import { Identifier } from "./Identifier"; export class GithubIdentifier extends Identifier { public static schemes = ["github"]; @@ -7,17 +8,8 @@ export class GithubIdentifier extends Identifier { public readonly repository: string; public readonly path: string; - constructor(uriToParse: uri.URI, title?: string) { - let [identifier, subPath] = stringWithoutInitialSlash( - uriToParse.path - ).split("/:/", 2); - - const parts = identifier.split("/"); - if (parts.length < 2) { - throw new Error("invalid identifier"); - // return "invalid-identifier" as "invalid-identifier"; - } - + constructor(uriToParse: uri.URI) { + const parts = uriToParse.path.split("/"); const owner = parts.shift()!.toLowerCase(); const repository = parts.shift()!.toLowerCase(); const path = parts.join("/"); @@ -29,9 +21,7 @@ export class GithubIdentifier extends Identifier { scheme: uriToParse.scheme, authority: uriToParse.authority, path: owner + "/" + repository + (path.length ? "/" + path : ""), - }), - subPath, - title + }) ); this.path = path; this.owner = owner; diff --git a/packages/editor/src/identifiers/HttpsIdentifier.ts b/packages/editor/src/identifiers/HttpsIdentifier.ts index f0a2bd89a..10a39eba8 100644 --- a/packages/editor/src/identifiers/HttpsIdentifier.ts +++ b/packages/editor/src/identifiers/HttpsIdentifier.ts @@ -1,39 +1,26 @@ -import { uri, path } from "vscode-lib"; -import { Identifier, stringWithoutInitialSlash } from "./Identifier"; +import { uri } from "vscode-lib"; +import { Identifier } from "./Identifier"; export class HttpsIdentifier extends Identifier { public static schemes = ["http", "https"]; - public readonly subIdentifier: string | undefined; - - constructor(uriToParse: uri.URI, title?: string) { - let [identifier, subPath] = stringWithoutInitialSlash( - uriToParse.path - ).split("/:/", 2); + constructor(uri: uri.URI) { // call super to drop fragment, query, and make sure owner / repository is lowercase - super( - HttpsIdentifier.schemes, - uri.URI.from({ - scheme: uriToParse.scheme, - authority: uriToParse.authority, - path: identifier, - }), - subPath, - title - ); + super(HttpsIdentifier.schemes, uri); } - public fullUriOfSubPath() { - if (!this.subPath) { - return undefined; - } - - if (this.uri.path.endsWith("/")) { - return super.fullUriOfSubPath(); - } - // The parent is a file, not a directory. Join one level up - return this.uri.with({ - path: path.join(this.uri.path, "../", this.subPath), - }); - } + // public fullUriOfSubPath() { + // if (!this.subPath) { + // return undefined; + // } + // if (this.uri.path.endsWith("/")) { + // return super.fullUriOfSubPath(); + // } + // // The parent is a file, not a directory. Join one level up + // return Identifier.uriToString( + // this.uri.with({ + // path: path.join(this.uri.path, "../", this.subPath), + // }) + // ); + // } } diff --git a/packages/editor/src/identifiers/Identifier.ts b/packages/editor/src/identifiers/Identifier.ts index cec007be3..09cbb2b8d 100644 --- a/packages/editor/src/identifiers/Identifier.ts +++ b/packages/editor/src/identifiers/Identifier.ts @@ -1,67 +1,75 @@ -import { path, uri } from "vscode-lib"; +import { uri } from "vscode-lib"; export interface IdentifierFactory { new (uri: uri.URI, title?: string): T; schemes: string[]; } -export abstract class Identifier { - // TODO: get rid of subpaths? - public subPath?: string; +// http:localhost/_docs:/http:localhost/_docs/README.md +// http:localhost/_docs:/README.md + +// fs:localhost:/fs:localhost/README.md +// fs:localhost:/README.md - protected constructor( - schemes: string[], - public readonly uri: uri.URI, - subPath: string | undefined, - public readonly title?: string - ) { - if (!schemes.includes(this.uri.scheme)) { +// typecell:localhost/@yousef:/typecell:localhost/@yousef/id123 + +export abstract class Identifier { + protected constructor(schemes: string[], public readonly uri: uri.URI) { + if (!schemes.includes(uri.scheme)) { throw new Error("scheme doesn't match"); } - this.subPath = subPath; } public toString() { - return this.uri.toString(true); + // const uri1 = uri.URI.parse("http://example.com"); + // const uri2 = uri.URI.parse("http:///example.com"); + // debugger; + return Identifier.uriToString(this.uri); } - protected get defaultURI() { - return this.uri; + protected static uriToString(uri: uri.URI) { + let ret = uri.toString(true); + ret = ret.replace(/([a-z]+:)\/\//, "$1"); + return ret; } - public toRouteString(defaultScheme = "mx") { - let str = this.defaultURI.toString(true); - if ( - !this.defaultURI.authority && - this.defaultURI.scheme === defaultScheme - ) { - str = str.substring(defaultScheme.length + 1); - } - if (this.subPath) { - str += "/:/" + this.subPath; - } - if (!str.startsWith("/")) { - str = "/" + str; - } - return str; - } + // // TODO: make defaultScheme configurable + // public toRouteString(defaultScheme = "typecell") { + // let str = Identifier.uriToString(this.defaultURI); + // if ( + // !this.defaultURI.authority && + // this.defaultURI.scheme === defaultScheme + // ) { + // str = str.substring(defaultScheme.length + 1); + // } + // if (this.subPath) { + // str += ":/" + this.subPath; + // } + // if (!str.startsWith("/")) { + // str = "/" + str; + // } + // return str; + // } - public equals(other: Identifier) { - return this.toString() === other.toString(); - } + // public equals(other: Identifier) { + // return this.toString() === other.toString(); + // } - public equalsIncludingSub(other: Identifier) { - return this.equals(other) && this.subPath === other.subPath; - } + // public equalsIncludingSub(other: Identifier) { + // return this.equals(other) && this.subPath === other.subPath; + // } - public fullUriOfSubPath() { - if (!this.subPath) { - return undefined; - } - return this.uri.with({ - path: path.join(this.uri.path, this.subPath), - }); - } + // public fullUriOfSubPath() { + // if (!this.subPath) { + // return undefined; + // } + + // return Identifier.uriToString( + // this.uri.with({ + // path: path.join(this.uri.path || "/", this.subPath), + // }) + // ); + // } } export function stringWithoutInitialSlash(path: string) { diff --git a/packages/editor/src/identifiers/MatrixIdentifier.ts b/packages/editor/src/identifiers/MatrixIdentifier.ts index 7dba67397..84e8a99e8 100644 --- a/packages/editor/src/identifiers/MatrixIdentifier.ts +++ b/packages/editor/src/identifiers/MatrixIdentifier.ts @@ -1,7 +1,5 @@ import { uri } from "vscode-lib"; -import { Identifier, stringWithoutInitialSlash } from "./Identifier"; - -const DEFAULT_AUTHORITY = "mx.typecell.org"; +import { Identifier } from "./Identifier"; export class MatrixIdentifier extends Identifier { public static schemes = ["mx"]; @@ -9,14 +7,12 @@ export class MatrixIdentifier extends Identifier { public readonly document: string; constructor(uriToParse: uri.URI, title?: string) { - let [identifier, subPath] = stringWithoutInitialSlash( - uriToParse.path - ).split("/:/", 2); - identifier = identifier.toLowerCase().trim(); - const parts = identifier.split("/"); - if (parts.length !== 2) { + const parts = uriToParse.path.split("/"); + + if (parts.length !== 3 || parts[0] !== "") { throw new Error("invalid identifier"); } + parts.shift(); // TODO: validate parts, lowercase, alphanumeric? const [owner, document] = parts; @@ -30,30 +26,21 @@ export class MatrixIdentifier extends Identifier { ) { throw new Error("invalid identifier"); } + // call super to drop fragment, query, and make sure path is lowercase super( MatrixIdentifier.schemes, uri.URI.from({ scheme: uriToParse.scheme, - authority: uriToParse.authority || DEFAULT_AUTHORITY, + authority: uriToParse.authority, path: "/" + owner + "/" + document, - }), - subPath, - title + }) ); - this.owner = owner; + this.owner = owner.substring(1); this.document = document; } public get roomName() { - return this.owner + "/" + this.document; - } - - public get defaultURI() { - return this.uri.authority === DEFAULT_AUTHORITY - ? this.uri.with({ - authority: null, - }) - : this.uri; + return "@" + this.owner + "/" + this.document; } } diff --git a/packages/editor/src/identifiers/TypeCellIdentifier.ts b/packages/editor/src/identifiers/TypeCellIdentifier.ts new file mode 100644 index 000000000..c0ca6d6d9 --- /dev/null +++ b/packages/editor/src/identifiers/TypeCellIdentifier.ts @@ -0,0 +1,44 @@ +import { uri } from "vscode-lib"; +import { Identifier } from "./Identifier"; + +// const DEFAULT_AUTHORITY = "typecell.org"; + +// takes a path string like "this-is-a-title~sd32Sfsdf123" and returns the id "sd32Sfsdf123" +function getIdFromPath(path: string) { + if (path.includes("/")) { + throw new Error("invalid path"); + } + const parts = path.split("~"); + if (parts.length !== 2 || parts[1].charAt(0) !== "d") { + throw new Error("invalid path"); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return parts.pop()!; +} + +export class TypeCellIdentifier extends Identifier { + public static schemes = ["typecell"]; + + constructor(uriToParse: uri.URI) { + if (uriToParse.path.includes("~")) { + uriToParse = uriToParse.with({ + path: "/" + getIdFromPath(uriToParse.path.substring(1)), + }); + } + super(TypeCellIdentifier.schemes, uriToParse); + + if (!this.uri.path.startsWith("/d")) { + throw new Error("invalid path " + this.uri.path); + } + // if (this.uri.path.split("/").length !== 2) { + // throw new Error("invalid path"); + // } + } + + get documentId() { + if (!this.uri.path.startsWith("/d")) { + throw new Error("invalid path"); + } + return this.uri.path.substring(1); + } +} diff --git a/packages/editor/src/identifiers/index.ts b/packages/editor/src/identifiers/index.ts index 0f17a1a38..38fa470d3 100644 --- a/packages/editor/src/identifiers/index.ts +++ b/packages/editor/src/identifiers/index.ts @@ -1,64 +1,74 @@ -import { DEFAULT_HOMESERVER_HOST } from "../config/config"; -import { slug } from "../util/slug"; -import { uri } from "vscode-lib"; import { FileIdentifier } from "./FileIdentifier"; import { GithubIdentifier } from "./GithubIdentifier"; +import { HttpsIdentifier } from "./HttpsIdentifier"; import { Identifier, IdentifierFactory } from "./Identifier"; import { MatrixIdentifier } from "./MatrixIdentifier"; -import { HttpsIdentifier } from "./HttpsIdentifier"; +import { TypeCellIdentifier } from "./TypeCellIdentifier"; +import { pathToIdentifier } from "./paths/identifierPathHelpers"; -export const identifiers = new Map>(); +export const registeredIdentifiers = new Map< + string, + IdentifierFactory +>(); const factories = [ + TypeCellIdentifier, MatrixIdentifier, GithubIdentifier, FileIdentifier, HttpsIdentifier, ]; -for (let factory of factories) { - for (let scheme of factory.schemes) { - identifiers.set(scheme, factory); +for (const factory of factories) { + for (const scheme of factory.schemes) { + registeredIdentifiers.set(scheme, factory); } } -export function parseIdentifier( - identifier: string | { owner: string; document: string }, - title?: string -) { - if (typeof identifier !== "string") { - if (!identifier.owner.length || !identifier.document.length) { - throw new Error("invalid identifier"); - } - const ownerSlug = slug(identifier.owner); - const documentSlug = slug(identifier.document); - identifier = ownerSlug + "/" + documentSlug; - } - - if (identifier.startsWith("@")) { - identifier = - MatrixIdentifier.schemes[0] + - "://" + - DEFAULT_HOMESERVER_HOST + - "/" + - identifier; - } +// TODO: revisit owner +export function parseIdentifier(identifier: string) { + // if (typeof identifier !== "string") { + // if (!identifier.owner.length || !identifier.document.length) { + // throw new Error("invalid identifier"); + // } + // const ownerSlug = slug(identifier.owner); + // const documentSlug = slug(identifier.document); + // if (DEFAULT_PROVIDER === "supabase") { + // // TODO: title slug + // // in case of supabase, identifier.document is a nanoid + // identifier = "@" + ownerSlug + "/~" + identifier.document; + // } else { + // identifier = "@" + ownerSlug + "/" + documentSlug; + // } + // } - const parsedUri = uri.URI.parse(identifier); - const identifierType = identifiers.get(parsedUri.scheme); - if (!identifierType) { - throw new Error("identifier not found"); - } - const id = new identifierType(parsedUri, title); - return id; + // if (identifier.startsWith("@")) { + // if (DEFAULT_PROVIDER === "supabase") { + // identifier = + // TypeCellIdentifier.schemes[0] + + // ":" + + // "typecell.org" + // TODO: make this configurable + // "/" + + // identifier; + // } else { + // identifier = + // MatrixIdentifier.schemes[0] + + // ":" + + // DEFAULT_HOMESERVER_URI.authority + + // "/" + + // identifier; + // } + // } + return pathToIdentifier(identifier, undefined); + // return pathToIdentifiers(identifier)[0]; } -export function tryParseIdentifier( - identifier: string | { owner: string; document: string }, - title?: string -) { - try { - return parseIdentifier(identifier, title); - } catch (e) { - console.warn("invalid identifier", identifier, e); - return "invalid-identifier" as "invalid-identifier"; - } -} +// export function tryParseIdentifier( +// identifier: string | { owner: string; document: string }, +// title?: string +// ) { +// try { +// return parseIdentifier(identifier, title); +// } catch (e) { +// console.warn("invalid identifier", identifier, e); +// return "invalid-identifier" as "invalid-identifier"; +// } +// } diff --git a/packages/editor/src/identifiers/paths/identifierPathHelpers.test.ts b/packages/editor/src/identifiers/paths/identifierPathHelpers.test.ts new file mode 100644 index 000000000..0bec4909b --- /dev/null +++ b/packages/editor/src/identifiers/paths/identifierPathHelpers.test.ts @@ -0,0 +1,166 @@ +/** + * @vitest-environment jsdom + */ + +// http:localhost/_docs:/http:localhost/_docs/README.md +// http:localhost/_docs:/README.md + +import { beforeAll, describe, expect, it } from "vitest"; +import { + DefaultShorthandResolver, + defaultShorthandResolver, + identifiersToPath, + pathToIdentifier, + pathToIdentifiers, +} from "./identifierPathHelpers"; + +// fs:localhost:/fs:localhost/README.md +// fs:localhost:/README.md + +// typecell:localhost/@yousef:/typecell:localhost/@yousef/id123 + +describe("Identifier", () => { + beforeAll(() => { + // hardcode to http:localhost instead of using window.location. This makes writing the tests easier + defaultShorthandResolver.current.addShorthand( + "docs", + "http:localhost/_docs/" + ); + }); + it("parses basic identifier", () => { + const identifier = pathToIdentifier("http:localhost/_docs/README.md"); + expect(identifier.uri.scheme).toBe("http"); + expect(identifier.uri.authority).toBe("localhost"); + expect(identifier.uri.path).toBe("/_docs/README.md"); + }); + + it("parses basic path", () => { + const identifiers = pathToIdentifiers("http:localhost/_docs/README.md"); + expect(identifiers.length).toBe(1); + + const identifier = identifiers[0]; + expect(identifier.uri.scheme).toBe("http"); + expect(identifier.uri.authority).toBe("localhost"); + expect(identifier.uri.path).toBe("/_docs/README.md"); + }); + + it("parses nested identifier with full paths", () => { + const identifiers = pathToIdentifiers( + "http:localhost/_docs:/http:localhost/_docs/README.md" + ); + + expect(identifiers.length).toBe(2); + + expect(identifiers[0].uri.scheme).toBe("http"); + expect(identifiers[0].uri.authority).toBe("localhost"); + expect(identifiers[0].uri.path).toBe("/_docs"); + + expect(identifiers[1].uri.scheme).toBe("http"); + expect(identifiers[1].uri.authority).toBe("localhost"); + expect(identifiers[1].uri.path).toBe("/_docs/README.md"); + }); + + it("parses nested identifier with simplified", () => { + const identifiers = pathToIdentifiers("http:localhost/_docs:/README.md"); + + expect(identifiers.length).toBe(2); + + expect(identifiers[0].uri.scheme).toBe("http"); + expect(identifiers[0].uri.authority).toBe("localhost"); + expect(identifiers[0].uri.path).toBe("/_docs"); + + expect(identifiers[1].uri.scheme).toBe("http"); + expect(identifiers[1].uri.authority).toBe("localhost"); + expect(identifiers[1].uri.path).toBe("/_docs/README.md"); + }); + + it("parses 3 nested identifiers with simplified", () => { + const identifiers = pathToIdentifiers( + "http:localhost/_docs:/README.md:/test.md" + ); + + expect(identifiers.length).toBe(3); + + expect(identifiers[0].uri.scheme).toBe("http"); + expect(identifiers[0].uri.authority).toBe("localhost"); + expect(identifiers[0].uri.path).toBe("/_docs"); + + expect(identifiers[1].uri.scheme).toBe("http"); + expect(identifiers[1].uri.authority).toBe("localhost"); + expect(identifiers[1].uri.path).toBe("/_docs/README.md"); + + expect(identifiers[2].uri.scheme).toBe("http"); + expect(identifiers[2].uri.authority).toBe("localhost"); + expect(identifiers[2].uri.path).toBe("/_docs/README.md/test.md"); + }); +}); + +describe("Path handling", () => { + it("simplifies paths", () => { + const identifiers = pathToIdentifiers( + "http:localhost/hello/:/http:localhost/hello/README.md" + ); + const path = identifiersToPath(identifiers); + expect(path).toBe("http:localhost/hello/:/README.md"); + }); + + it("simplifies paths of tc identifiers", () => { + const identifiers = pathToIdentifiers( + "typecell:typecell.org/test~dsdf34f:/typecell:typecell.org/sub~dsdf34adff" + ); + const path = identifiersToPath(identifiers); + expect(path).toBe("dsdf34f:/dsdf34adff"); + }); + + it("simplifies paths of tc identifiers (with shortcuts)", () => { + // const path = identifiersToPath([props.project.identifier, identifier]); + const resolver = new DefaultShorthandResolver(); + resolver.addShorthand("@user/public", "typecell:typecell.org/dProject"); + + const identifiers = pathToIdentifiers("@user/public/dDocument", resolver); + expect(identifiers).length(2); + expect(identifiers[0].toString()).toBe("typecell:typecell.org/dProject"); + expect(identifiers[1].toString()).toBe("typecell:typecell.org/dDocument"); + + const path = identifiersToPath(identifiers, resolver); + expect(path).toBe("@user/public/dDocument"); + }); + + it("handles shorthands", () => { + const identifiers = pathToIdentifiers( + "http:localhost/_docs/:/http:localhost/_docs/README.md" + ); + const path = identifiersToPath(identifiers); + expect(path).toBe("docs/README.md"); + }); + + it("handles default base", () => { + const identifiers = pathToIdentifiers("dSdff234234"); + + expect(identifiers.length).toBe(1); + + expect(identifiers[0].uri.scheme).toBe("typecell"); + expect(identifiers[0].uri.authority).toBe("typecell.org"); + expect(identifiers[0].uri.path).toBe("/dSdff234234"); + + const path = identifiersToPath(identifiers); + expect(path).toBe("dSdff234234"); + }); + + it("handles default base and multiple ids", () => { + const identifiers = pathToIdentifiers( + "dNabEGgVNVkEs:/dw1RUcC4jQ6Ny:/dMuz9MMJXaG5E" + ); + + expect(identifiers.length).toBe(3); + + expect(identifiers[0].uri.scheme).toBe("typecell"); + expect(identifiers[0].uri.authority).toBe("typecell.org"); + expect(identifiers[0].uri.path).toBe("/dNabEGgVNVkEs"); + + const path = identifiersToPath(identifiers); + expect(path).toBe("dNabEGgVNVkEs:/dw1RUcC4jQ6Ny:/dMuz9MMJXaG5E"); + }); +}); + +// TODO: add tests for mixed paths (projects with mixed identifiers) diff --git a/packages/editor/src/identifiers/paths/identifierPathHelpers.ts b/packages/editor/src/identifiers/paths/identifierPathHelpers.ts new file mode 100644 index 000000000..61eb3befb --- /dev/null +++ b/packages/editor/src/identifiers/paths/identifierPathHelpers.ts @@ -0,0 +1,337 @@ +import { path, uri } from "vscode-lib"; +import { registeredIdentifiers } from ".."; + +import { + DEFAULT_IDENTIFIER_BASE, + DEFAULT_IDENTIFIER_BASE_STRING, +} from "../../config/config"; +import { Identifier } from "../Identifier"; +import { TypeCellIdentifier } from "../TypeCellIdentifier"; + +// if (location.pathname.startsWith("/docs")) { +// const id = +// ENVIRONMENT === "DEV" +// ? parseIdentifier("http://localhost:4174/_docs/index.json", "Docs") // +// : //parseIdentifier("fs:", "Docs") +// /*parseIdentifier( +// "github:yousefed/typecell-next/docs" + +// (remainingPath ? "/:/" + remainingPath : "") +// );*/ +// ENVIRONMENT === "PREVIEW" +// ? parseIdentifier("http:/_docs/index.json", "Docs") +// : parseIdentifier("https:/_docs/index.json", "Docs"); + +// return ; +// } + +abstract class ShorthandResolver { + /** + * Given a shorthand (e.g.: `docs`), return the expanded path, e.g.: `http:localhost/_docs/` + */ + abstract shorthandToExpandedPath(shorthand: string): string | undefined; + + /** + * Given an expanded path (e.g.: `http:localhost/_docs/`), return the shorthand, e.g.: `docs` + */ + abstract expandedPathToShorthandExact( + expandedPath: string + ): string | undefined; + + /** + * Given a path (e.g.: `docs/README.md`), return the shorthand at the start of it (e.g.: `docs`) + */ + abstract findShorthandAtStartOfPath(path: string): + | { + shorthand: string; + identifier: string; + } + | undefined; +} + +export class DefaultShorthandResolver extends ShorthandResolver { + private readonly shortHands: Record = { + docs: window.location.protocol + window.location.host + "/_docs/", + // docs: "fs:localhost:3001", + // docs: "http:localhost/_docs/", + }; + + private readonly reverseShortHands = Object.entries(this.shortHands).reduce( + (acc, [key, value]) => { + acc[value] = key; + return acc; + }, + {} as Record + ); + + public addShorthand(shorthand: string, expandedPath: string) { + this.shortHands[shorthand] = expandedPath; + this.reverseShortHands[expandedPath] = shorthand; + } + + shorthandToExpandedPath(shorthand: string): string | undefined { + return this.shortHands[shorthand]; + } + + expandedPathToShorthandExact(expandedPath: string): string | undefined { + return this.reverseShortHands[expandedPath]; + } + + findShorthandAtStartOfPath(path: string): + | { + shorthand: string; + identifier: string; + } + | undefined { + let match: { shorthand: string; identifier: string } | undefined; + for (const sh of Object.keys(this.shortHands)) { + if (path.startsWith(sh)) { + if (!match || sh.length > match.shorthand.length) { + match = { + shorthand: sh, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + identifier: this.shortHands[sh]!, + }; + } + } + } + return match; + } +} + +export const defaultShorthandResolver = { + current: new DefaultShorthandResolver(), +}; + +export function setDefaultShorthandResolver( + shorthandResolver: DefaultShorthandResolver +) { + defaultShorthandResolver.current = shorthandResolver; +} + +/** + * given an identifier, returns the path and shorthand to it, if it exists + */ +function getPathAndShorthandFromFirstIdentifier( + identifier: Identifier, + shorthandResolver: ShorthandResolver +) { + const fullPath = identifier.toString(); + + const shorthand = shorthandResolver.expandedPathToShorthandExact(fullPath); + if (shorthand) { + return { + type: "shorthand", + path: shorthand, + separator: "/", + }; + } + + const path = getSimplePathPartForIdentifier( + identifier, + DEFAULT_IDENTIFIER_BASE + ); + + return { + type: "path", + path, + separator: ":/", + }; +} + +function getSimplePathPartForIdentifier( + identifier: Identifier, + previousOrDefaultIdentifierUri?: uri.URI +) { + if ( + previousOrDefaultIdentifierUri && + previousOrDefaultIdentifierUri.scheme === identifier.uri.scheme && + previousOrDefaultIdentifierUri.authority === identifier.uri.authority + ) { + if (identifier instanceof TypeCellIdentifier) { + // TODO: this hardcoding is hacky. also, do we want different behavior for different identifiers? + return identifier.uri.path.substring(1); + } else if ( + identifier.uri.path.startsWith(previousOrDefaultIdentifierUri.path) + ) { + // we can simplify this path + return identifier.uri.path.substring( + previousOrDefaultIdentifierUri.path.length + ); + } + } + return identifier.toString(); +} + +/** + * Given multiple identifiers, returns the full path to identifiers combined + * + * Will: + * - use shorthand if possible + * - simplify paths of nested identifiers if possible + */ +export function identifiersToPath( + identifiers: Identifier[] | Identifier, + shorthandResolver = defaultShorthandResolver.current +): string { + if (!Array.isArray(identifiers)) { + identifiers = [identifiers]; + } + + if (!identifiers.length) { + throw new Error("no identifiers passed"); + } + + let lastIdentifier: Identifier = identifiers[0]; + const rootPath = getPathAndShorthandFromFirstIdentifier( + lastIdentifier, + shorthandResolver + ); + let path = rootPath.path; + let sep = rootPath.separator; + + for (let i = 1; i < identifiers.length; i++) { + const identifier = identifiers[i]; + const part = getSimplePathPartForIdentifier( + identifiers[i], + lastIdentifier.uri + ); + path += sep + part; + lastIdentifier = identifier; + sep = ":/"; + } + return path; +} + +/** + * Return an identifier with an appended path + */ +export function getIdentifierWithAppendedPath( + identifier: Identifier, + pathToAppend: string +): Identifier { + const uri = identifier.uri.with({ + path: path.join( + identifier.uri.path || "/", + encodeURIComponent(pathToAppend) + ), + }); + + return parseUriIdentifier(uri); +} + +/** + * Given an exact identifier string, return proper Identifier + */ +export function parseFullIdentifierString( + identifierString: string +): Identifier { + // our identifiers don't use scheme://xxx but scheme:xxx. Reason for this decision is to make it work with react-router + identifierString = identifierString.replace(/([a-z]+:)/, "$1//"); + + const parsedUri = uri.URI.parse(identifierString); + + return parseUriIdentifier(parsedUri); +} + +function parseUriIdentifier(parsedUri: uri.URI) { + const identifierType = registeredIdentifiers.get(parsedUri.scheme); + if (!identifierType) { + throw new Error("identifier not found"); + } + const id = new identifierType(parsedUri); + return id; +} + +/** + * Given a path of a single identifier (i.e. no separators), + * returns the identifier or throws an error + */ +export function pathToIdentifier( + inputPath: string, + parentIdentifierList: Identifier[] = [], + shorthandResolver = defaultShorthandResolver.current +): Identifier { + // const shorthand = shorthandResolver.expandedPathToShorthandExact(inputPath); + // if (shorthand && !parentIdentifierList.length) { + // inputPath = shorthand; + // } + + if (!inputPath.includes(":") && !parentIdentifierList.length) { + console.log(inputPath); + // no scheme provided + inputPath = DEFAULT_IDENTIFIER_BASE_STRING + inputPath; //.substring(1); + } else { + let parsedUri = uri.URI.parse(inputPath); + + if (parsedUri.scheme === "file") { + // this indicates there was no scheme provided + if (!parentIdentifierList.length) { + throw new Error("no scheme provided, and no parents " + inputPath); + } + + const parent = parentIdentifierList[parentIdentifierList.length - 1]; + + parsedUri = parent.uri.with({ + // TODO: this hardcoding is hacky. also, do we want different behavior for different identifiers? + path: + parent instanceof TypeCellIdentifier + ? "/" + inputPath + : path.join(parent.uri.path || "/", inputPath), + }); + inputPath = parsedUri.toString().replace("://", ":"); + } + } + console.log(inputPath); + return parseFullIdentifierString(inputPath); +} + +/** + * Given a full path, returns an array of identifiers matched + */ +export function pathToIdentifiers( + path: string, + shorthandResolver = defaultShorthandResolver.current +): Identifier[] { + const identifiers: Identifier[] = []; + const parts = path.split(":/"); + + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + + const shortHandMatched = shorthandResolver.findShorthandAtStartOfPath(part); + + if (shortHandMatched) { + identifiers.push( + parseFullIdentifierString(shortHandMatched.identifier) + // pathToIdentifier(shortHandMatched, identifiers, shorthandResolver) + ); + const remaining = part + .substring(shortHandMatched.shorthand.length) + .replace(/^\//, ""); // remove leading / + if (remaining.length) { + identifiers.push( + pathToIdentifier(remaining, identifiers, shorthandResolver) + ); + } + } else { + const identifier = pathToIdentifier(part, identifiers, shorthandResolver); + identifiers.push(identifier); + } + } + return identifiers; +} + +export function tryPathToIdentifiers( + path: string, + shorthandResolver = defaultShorthandResolver.current +) { + try { + const ret = pathToIdentifiers(path, shorthandResolver); + if (!ret.length) { + return "invalid-identifier"; + } + return ret; + } catch (e) { + return "invalid-identifier"; + } +} diff --git a/packages/editor/src/index.host.tsx b/packages/editor/src/index.host.tsx index dd9b6fe0a..e243b5a42 100644 --- a/packages/editor/src/index.host.tsx +++ b/packages/editor/src/index.host.tsx @@ -1,27 +1,23 @@ -import * as Olm from "@matrix-org/olm"; -// @ts-ignore -import olmWasmPath from "@matrix-org/olm/olm.wasm?url"; import * as yjsBindings from "@syncedstore/yjs-reactive-bindings"; -import { Buffer } from "buffer"; import * as mobx from "mobx"; -import * as monaco from "monaco-editor"; -import * as process from "process"; import { createRoot } from "react-dom/client"; import App from "./app/App"; -import { MATRIX_CONFIG } from "./config/config"; -import { validateHostDomain } from "./config/security"; -import { setMonacoDefaults } from "./runtime/editor"; -import setupNpmTypeResolver from "./runtime/editor/languages/typescript/npmTypeResolver"; -import setupTypecellTypeResolver from "./runtime/editor/languages/typescript/typecellTypeResolver"; -import { MonacoContext } from "./runtime/editor/MonacoContext"; -import { initializeStoreService } from "./store/local/stores"; +import { SupabaseSessionStore } from "./app/supabase-auth/SupabaseSessionStore"; +import { supabaseAuthProvider } from "./app/supabase-auth/supabaseAuthProvider"; +import { DEFAULT_PROVIDER } from "./config/config"; +import { env } from "./config/env"; +import { validateHostDomain, validateSupabaseConfig } from "./config/security"; + +import { SessionStore } from "./store/local/SessionStore"; import "./styles/index.css"; -// polyfills (mostly required for matrix-crdt) -(window as any).Buffer = Buffer; -(window as any).process = process; +// // polyfills (mostly required for matrix-crdt) +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// (window as any).Buffer = Buffer; +// // eslint-disable-next-line @typescript-eslint/no-explicit-any +// (window as any).process = process; -if (import.meta.env.DEV) { +if (env.VITE_ENVIRONMENT === "development") { // disables error overlays // We make use of React Error Boundaries to catch exceptions during rendering of // user-defined react components. It's annoying (and slow) to get the React error overlay @@ -30,61 +26,35 @@ if (import.meta.env.DEV) { // (reo as any).stopReportingRuntimeErrors(); } -// const config = { -// default_server_config: { -// "m.homeserver": { -// base_url: "https://matrix-client.matrix.org", -// server_name: "matrix.org", -// }, -// "m.identity_server": { -// base_url: "https://vector.im", -// }, -// }, -// }; -// const validatedConfig = await verifyServerConfig(config); - -const cachedValidatedConfig = { - hsName: MATRIX_CONFIG.hsName, - hsNameIsDifferent: true, - hsUrl: MATRIX_CONFIG.hsUrl, - isDefault: true, - isNameResolvable: true, - isUrl: MATRIX_CONFIG.isUrl, - warning: null, -}; - console.log("Loading host", window.location.href); async function init() { if (!validateHostDomain()) { throw new Error("invalid hostname for host"); } - // TODO: separate code from iframe and parent window? - // const [Olm, monaco] = await Promise.all([ - // import("@matrix-org/olm"), - // undefined as any, //import("monaco-editor"), - // ]); - await Olm.init({ - locateFile: () => olmWasmPath, - }); + if (!validateSupabaseConfig()) { + throw new Error("accessing prod db on non-prod"); + } yjsBindings.enableMobxBindings(mobx); - initializeStoreService(); - setMonacoDefaults(monaco); - setupTypecellTypeResolver(monaco); - setupNpmTypeResolver(monaco); - + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const root = createRoot(document.getElementById("root")!); + const authProvider = supabaseAuthProvider; + + const sessionStore: SessionStore = + DEFAULT_PROVIDER === "matrix" + ? new SupabaseSessionStore() //new MatrixSessionStore(new MatrixAuthStore()) + : new SupabaseSessionStore(); + + await sessionStore.initialize(); + root.render( - // TODO: support strictmode - // - - - - // + // + + // ); } diff --git a/packages/editor/src/index.iframe.tsx b/packages/editor/src/index.iframe.tsx index 8d7eb6e37..4fbc3004d 100644 --- a/packages/editor/src/index.iframe.tsx +++ b/packages/editor/src/index.iframe.tsx @@ -1,12 +1,13 @@ -import React from "react"; +/* eslint-disable @typescript-eslint/no-non-null-assertion */ // eslint-disable-next-line @typescript-eslint/no-unused-vars import { createRoot } from "react-dom/client"; -import * as reo from "react-error-overlay"; import { getMainDomainFromIframe, validateFrameDomain, } from "./config/security"; -import Frame from "./runtime/executor/executionHosts/sandboxed/iframesandbox/Frame"; +// import Frame from "./runtime/executor/executionHosts/sandboxed/iframesandbox/Frame"; +import { Frame } from "@typecell-org/frame"; +import "@typecell-org/frame/style.css"; import "./styles/iframe.css"; if (import.meta.env.DEV) { @@ -15,11 +16,13 @@ if (import.meta.env.DEV) { // user-defined react components. It's annoying (and slow) to get the React error overlay // while editing TypeCell cells // Note that this breaks hot reloading - try { - (reo as any).stopReportingRuntimeErrors(); - } catch (e) { - console.error(e); - } + // import("react-error-overlay").then((m) => { + // try { + // (m as any).stopReportingRuntimeErrors(); + // } catch (e) { + // console.error(e); + // } + // }); } console.log("Loading iframe", window.location.href); @@ -31,15 +34,20 @@ base.setAttribute("target", "_blank"); document.head.appendChild(base); async function init() { - // TODO: prevent monaco from loading in frame if (!validateFrameDomain()) { throw new Error("invalid hostname for frame"); } const root = createRoot(document.getElementById("root")!); + const search = new URLSearchParams(window.location.hash.substring(1)); root.render( - - - + // + + // ); } diff --git a/packages/editor/src/index.tsx b/packages/editor/src/index.tsx index b50968f3b..80a1f9548 100644 --- a/packages/editor/src/index.tsx +++ b/packages/editor/src/index.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import React from "react"; import ReactDOM from "react-dom"; import reportWebVitals from "./reportWebVitals"; @@ -31,7 +32,9 @@ init(); // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals reportWebVitals(); +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - for React-based plugins window.react = React; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore - for React-based plugins window.reactDOM = ReactDOM; diff --git a/packages/editor/src/integrations/github/github.test.ts b/packages/editor/src/integrations/github/github.test.ts.bak similarity index 100% rename from packages/editor/src/integrations/github/github.test.ts rename to packages/editor/src/integrations/github/github.test.ts.bak diff --git a/packages/editor/src/integrations/github/github.ts b/packages/editor/src/integrations/github/github.ts.bak similarity index 88% rename from packages/editor/src/integrations/github/github.ts rename to packages/editor/src/integrations/github/github.ts.bak index b94f3aa3b..d925eb028 100644 --- a/packages/editor/src/integrations/github/github.ts +++ b/packages/editor/src/integrations/github/github.ts.bak @@ -1,10 +1,6 @@ // import * as octokit from "octokit"; -import { inc } from "semver"; -import { Identifier } from "../../identifiers/Identifier"; -import { CellModel } from "../../models/CellModel"; -import { DocConnection } from "../../store/DocConnection"; -import { base64 } from "@typecell-org/common"; +import { base64 } from "@typecell-org/util"; type ParentCommit = { version: string | undefined; @@ -244,47 +240,47 @@ export async function getTargetInfo(repo: RepoOptions): Promise { // return {repoInfo.data.default_branch; } -export async function saveDocumentToGithub(id: Identifier) { - const targetRepo = { - owner: "yousefed", - repo: "testrep", - }; - - const dc = DocConnection.load(id); - const doc = await dc.waitForDoc(); - const template = await getTemplateTree(); - - const targetInfo = await getTargetInfo(targetRepo); - - let newVersion = "1.0.0"; - if (targetInfo.version) { - let versionBumped = inc(targetInfo.version, "minor"); - if (!versionBumped) { - throw new Error("couldn't parse version"); - } - newVersion = versionBumped; - } - const copy = await copyTree( - templateRepo, - targetRepo, - template.data.tree, - doc.doc.cells, - newVersion - ); - - let branch: string = await getUnusedBranch(targetRepo, "v" + newVersion); - - await commit(targetRepo, copy, branch, targetInfo.commitSHA); - - await githubClient.rest.pulls.create({ - ...targetRepo, - head: branch, - base: targetInfo.defaultBranch, - title: branch, - }); - - return template; -} +// export async function saveDocumentToGithub(id: Identifier) { +// const targetRepo = { +// owner: "yousefed", +// repo: "testrep", +// }; + +// const dc = DocConnection.load(id); +// const doc = await dc.waitForDoc(); +// const template = await getTemplateTree(); + +// const targetInfo = await getTargetInfo(targetRepo); + +// let newVersion = "1.0.0"; +// if (targetInfo.version) { +// let versionBumped = inc(targetInfo.version, "minor"); +// if (!versionBumped) { +// throw new Error("couldn't parse version"); +// } +// newVersion = versionBumped; +// } +// const copy = await copyTree( +// templateRepo, +// targetRepo, +// template.data.tree, +// doc.doc.cells, +// newVersion +// ); + +// let branch: string = await getUnusedBranch(targetRepo, "v" + newVersion); + +// await commit(targetRepo, copy, branch, targetInfo.commitSHA); + +// await githubClient.rest.pulls.create({ +// ...targetRepo, +// head: branch, +// base: targetInfo.defaultBranch, +// title: branch, +// }); + +// return template; +// } export async function getUnusedBranch(repo: RepoOptions, branch: string) { let tryN = 1; diff --git a/packages/editor/src/integrations/markdown/import.ts b/packages/editor/src/integrations/markdown/import.ts index 2f79abddf..8bb881496 100644 --- a/packages/editor/src/integrations/markdown/import.ts +++ b/packages/editor/src/integrations/markdown/import.ts @@ -1,17 +1,27 @@ -import { uniqueId } from "@typecell-org/common"; +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { + BlockNoteEditor, + createTipTapBlock, + defaultBlockSchema, +} from "@blocknote/core"; +import { mergeAttributes } from "@tiptap/core"; import * as parsers from "@typecell-org/parsers"; - +import { uniqueId } from "@typecell-org/util"; import * as Y from "yjs"; -export function markdownToYDoc(markdown: string) { +export function markdownToXmlFragment( + markdown: string, + fragment: Y.XmlFragment | undefined +) { + if (!fragment) { + const containerDoc = new Y.Doc(); // the doc is needed because otherwise the fragment doesn't work + fragment = containerDoc.getXmlFragment("doc"); + } const nbData = parsers.markdownToDocument(markdown); - const newDoc = new Y.Doc(); - newDoc.getMap("meta").set("type", "!notebook"); - let xml = newDoc.getXmlFragment("doc"); const elements = nbData.cells.map((cell) => { const element = new Y.XmlElement("typecell"); - element.setAttribute("block-id", uniqueId.generate()); // TODO: do we want random blockids? for markdown sources? + element.setAttribute("block-id", uniqueId.generateId("block")); // TODO: do we want random blockids? for markdown sources? if (cell.language === "markdown") { element.insert(0, [new Y.XmlText(cell.code)]); @@ -23,7 +33,97 @@ export function markdownToYDoc(markdown: string) { return element; }); - xml.insert(0, elements); + fragment.insert(0, elements); + return fragment; +} + +export async function markdownToYDoc(markdown: string, title?: string) { + const newDoc = new Y.Doc(); + newDoc.getMap("meta").set("type", "!richtext"); + + const xml = newDoc.getXmlFragment("doc"); + + const editor = new BlockNoteEditor({ + blockSchema: { + ...defaultBlockSchema, + codeblock: { + propSchema: { + language: { + type: "string", + default: "typescript", + }, + }, + node: MonacoBlockContent, + }, + }, + collaboration: { + fragment: xml, + provider: undefined as any, + user: undefined as any, + }, + initialContent: [ + { + id: "sdfsdf", + type: "paragraph", + }, + ], + }); + const blocks = await editor.markdownToBlocks(markdown); + editor.replaceBlocks(editor.topLevelBlocks, blocks); + + // markdownToXmlFragment(markdown, xml); + + if (title) { + newDoc.getMap("meta").set("title", title); + // newDoc.getText("title").delete(0, newDoc.getText("title").length); + // newDoc.getText("title").insert(0, title); + } + + // debugger; return newDoc; } + +// hacky +export const MonacoBlockContent = createTipTapBlock({ + name: "codeblock", + content: "inline*", + editable: true, + selectable: true, + whitespace: "pre", + code: true, + + addAttributes() { + return { + language: { + default: "typescript", + parseHTML: (element) => element.getAttribute("data-language"), + renderHTML: (attributes) => { + return { + "data-language": attributes.language, + }; + }, + }, + }; + }, + + parseHTML() { + return [ + { + tag: "code", + priority: 200, + node: "codeblock", + }, + ]; + }, + + renderHTML({ HTMLAttributes }) { + return [ + "code", + mergeAttributes(HTMLAttributes, { + // class: styles.blockContent, + "data-content-type": this.name, + }), + ]; + }, +}); diff --git a/packages/editor/src/models/CellListModel.ts b/packages/editor/src/models/CellListModel.ts deleted file mode 100644 index 7907c9ae0..000000000 --- a/packages/editor/src/models/CellListModel.ts +++ /dev/null @@ -1,105 +0,0 @@ -import * as _ from "lodash"; -import * as Y from "yjs"; -import { uniqueId } from "@typecell-org/common"; -import { CellLanguage, CellModel } from "./CellModel"; - -export class CellListModel { - /** @internal */ - constructor(private documentId: string, private fragment: Y.XmlFragment) {} - - private _previousChildren: any[] = []; - private _previousCells: CellModel[] = []; - private _previousCellsById = new Map(); - - public get cells() { - /** - * because the observable of this.fragment will change anytime the text inside a element changes, - * we make an optimization here, to see whether the fragments have actually changed. - * i.e.: - * - we want to return a new value when a cell has been added (or it's id / language has changed) - * - we don't want to return a new value when the contents of a cell have been modified - */ - - const children = this.fragment.toArray().filter((val) => { - return val instanceof Y.XmlElement && val.nodeName === "typecell"; - }) as Y.XmlElement[]; - - let changed = !_.isEqual(children, this._previousChildren); - const newCells = []; - const newCellsById = new Map(); - for (let child of children) { - const id = child.getAttribute("block-id"); - const lang = child.getAttribute("language"); - - const old = this._previousCellsById.get(id); - - if (!old || old.language !== lang || old.xmlElement !== child) { - const cm = new CellModel(this.documentId, child); - newCells.push(cm); - newCellsById.set(id, cm); - changed = true; - } else { - newCells.push(old); - newCellsById.set(id, old); - } - } - - if (!changed) { - return this._previousCells; - } - - this._previousCells = newCells; - this._previousChildren = children; - this._previousCellsById = newCellsById; - - return this._previousCells; - } - - public addCell(i: number, language: CellLanguage, content: string) { - const element = new Y.XmlElement("typecell"); - element.setAttribute("block-id", uniqueId.generate()); - element.setAttribute("language", language); - element.insert(0, [new Y.XmlText(content)]); - this.fragment.insert(i, [element]); - } - - // theoretically, the fragment could contain other elements than elements, - // e.g.: when we're rendering a !richtext type as a notebook. - private findIndexByTypecellIndex(i: number) { - const typecellChildren = this.fragment.toArray().filter((val) => { - return val instanceof Y.XmlElement && val.nodeName === "typecell"; - }) as Y.XmlElement[]; - const index = this.fragment - .toArray() - .findIndex((el) => el === typecellChildren[i]); - if (index !== i) { - console.warn("warning: typecell index doesn't equal fragment index"); - } - if (index < 0) { - throw new Error("element not found"); - } - return index; - } - // TODO: for good multiplayer, should work by id? - public removeCell(i: number) { - this.fragment.delete(this.findIndexByTypecellIndex(i)); - } - - // TODO: for good multiplayer, should work with fractional indices? - moveCell = (from: number, to: number) => { - const index = this.findIndexByTypecellIndex(from); - const toIndex = this.findIndexByTypecellIndex(to); - - const element = this.fragment.get(index); - if (!(element instanceof Y.XmlElement)) { - throw new Error("unexpected element type"); - } - let copy = new Y.XmlElement("typecell"); - copy.setAttribute("language", element.getAttribute("language")); - copy.setAttribute("block-id", element.getAttribute("block-id")); - copy.insert(0, [new Y.XmlText((element.firstChild! as Y.Text).toString())]); - this.fragment.delete(index); - - this.fragment.insert(toIndex, [copy]); - }; -} diff --git a/packages/editor/src/models/CellModel.ts b/packages/editor/src/models/CellModel.ts deleted file mode 100644 index 2e0a8bcaf..000000000 --- a/packages/editor/src/models/CellModel.ts +++ /dev/null @@ -1,73 +0,0 @@ -import * as Y from "yjs"; -import { NotebookCellModel } from "../app/documentRenderers/notebook/NotebookCellModel"; -import { UnreachableCaseError } from "../util/UnreachableCaseError"; - -export type CellLanguage = "typescript" | "markdown" | "css"; -const VALID_LANGUAGES = ["typescript", "markdown", "css"]; -export class CellModel implements NotebookCellModel { - /** @internal */ - public readonly code: Y.Text; - public readonly id: string; - public readonly language: CellLanguage; - - /** @internal */ - constructor( - public readonly parentDocumentId: string, - /** @internal */ - public readonly xmlElement: Y.XmlElement // public readonly path: string, // /** @internal */ // public readonly code: Y.Text - ) { - const id = xmlElement.getAttribute("block-id"); - if (!id) { - throw new Error("no id specified"); - } - this.id = id; - - const code = xmlElement.firstChild; - if (!code || !(code instanceof Y.XmlText)) { - throw new Error("should be text"); - } - this.code = code; - - let attrLanguage = xmlElement.getAttribute("language"); - if (!attrLanguage) { - console.warn("setting default language to typescript"); - attrLanguage = "typescript"; - xmlElement.setAttribute("language", attrLanguage); - } - if (!VALID_LANGUAGES.includes(attrLanguage)) { - throw new Error("unexpected language for cell"); - } - this.language = attrLanguage as CellLanguage; - } - - public setLanguage(value: CellLanguage) { - this.xmlElement.setAttribute("language", value); - } - - public get extension() { - if (this.language === "typescript") { - return "tsx"; - } else if (this.language === "markdown") { - return "md"; - } else if (this.language === "css") { - return "css"; - } else { - throw new UnreachableCaseError(this.language); - } - } - - public get path() { - return ( - "!@" + this.parentDocumentId + "/" + this.id + ".cell." + this.extension - ); - } - - // /** @internal */ - // public get code() { - // const child = this.fragment.firstChild; - // if (!(child instanceof Y.XmlText)) { - // throw new Error("should be text"); - // } - // return child; - // } -} diff --git a/packages/editor/src/models/TypeCellCodeModel.ts b/packages/editor/src/models/TypeCellCodeModel.ts deleted file mode 100644 index 0ac52ab58..000000000 --- a/packages/editor/src/models/TypeCellCodeModel.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { autorun, untracked } from "mobx"; -import type * as monaco from "monaco-editor"; -import { event, lifecycle } from "vscode-lib"; -import * as Y from "yjs"; -import { NotebookCellModel } from "../app/documentRenderers/notebook/NotebookCellModel"; - -/** - * A CodeModel that bridges yjs and Monaco. - * The model is added to the monaco runtime the first time acquireMonacoModel is called. - * It's then kept in monaco until all references to TypeCellCodeModel are released. - * - * TypeCellCodeModel observes a Y.Text as source-of-truth - */ -export class TypeCellCodeModel extends lifecycle.Disposable { - private readonly uri: monaco.Uri; - - constructor( - public readonly path: string, - public readonly language: string, - private readonly codeText: Y.Text, - private monacoInstance: typeof monaco - ) { - super(); - const dispose = autorun(() => { - this.codeText.toString(); // tracked by mobx - this._onDidChangeContent.fire(); - }); - this._register({ - dispose, - }); - this.uri = this.monacoInstance.Uri.file(path); - } - - public getValue() { - return untracked(() => this.codeText.toString()); - } - - private readonly _onWillDispose: event.Emitter = this._register( - new event.Emitter() - ); - public readonly onWillDispose: event.Event = this._onWillDispose.event; - - private readonly _onDidChangeContent: event.Emitter = this._register( - new event.Emitter() - ); - public readonly onDidChangeContent: event.Event = - this._onDidChangeContent.event; - - private monacoModelListener: lifecycle.IDisposable | undefined; - private monacoModelReferences = 0; - private monacoModel: monaco.editor.ITextModel | undefined; - - public acquireMonacoModel() { - this.monacoModelReferences++; - if (!this.monacoModel) { - this.monacoModel = - this.monacoInstance.editor.getModel(this.uri) || undefined; - if (this.monacoModel) { - throw new Error("model already exists"); - } - this.monacoModel = this.monacoInstance.editor.createModel( - this.getValue(), - this.language, - this.uri - ); - this.monacoModelListener = this.onDidChangeContent(() => { - if (!this.monacoModel || this.monacoModel.isDisposed()) { - throw new Error("monaco model already disposed (change content)"); - } - const value = this.getValue(); - if (this.monacoModel.getValue() !== value) { - this.monacoModel.setValue(value); - } - }); - } - return this.monacoModel; - } - - private disposeMonacoModel() { - if (this.monacoModelReferences > 0) { - // This is suspicious, happens when compiling code and releasing at same time? - console.error("disposing TypeCellCodeModel, but still has references"); - } - - if ( - !this.monacoModel || - this.monacoModel.isDisposed() || - !this.monacoModelListener - ) { - console.warn("monaco already already disposed"); - // throw new Error("monaco already already disposed"); - return; - } - this.monacoModel.dispose(); - this.monacoModelListener.dispose(); - } - - public releaseMonacoModel() { - this.monacoModelReferences--; - if (this.monacoModelReferences < 0) { - throw new Error("monaco model released too often"); - } - if (this.monacoModelReferences === 0) { - // We keep the monacomodel in cache. We keep a lazy reference to the Monaco Model, because - // maybe someone else is quickly editing the underlying document, - // which we then need to recompile and need a new Monaco model for - console.log( - "releaseMonacoModel no more references, but we're not disposing yet" - ); - } - } - - public dispose() { - this._onWillDispose.fire(); - this.disposeMonacoModel(); - super.dispose(); - } -} - -class ModelCollection extends lifecycle.ReferenceCollection { - protected createReferencedObject( - key: string, - ...args: any[] - ): TypeCellCodeModel { - return new TypeCellCodeModel(key, args[0], args[1], args[2]); - } - - protected destroyReferencedObject( - key: string, - object: TypeCellCodeModel - ): void { - object.dispose(); - } -} - -const modelStore = new ModelCollection(); - -export function getTypeCellCodeModel( - cell: NotebookCellModel, - monacoInstance: typeof monaco -) { - return modelStore.acquire( - cell.path, - cell.language, - cell.code, - monacoInstance - ); -} diff --git a/packages/editor/src/runtime/Runtime.ts b/packages/editor/src/runtime/Runtime.ts deleted file mode 100644 index 0097ab080..000000000 --- a/packages/editor/src/runtime/Runtime.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Identifier } from "../identifiers/Identifier"; - -// TODO: implement a class that wraps the usage of editor / execution / compiler / extensions -export class Runtime { - // constructor() {} - - public registerModel(documentId: Identifier) {} -} diff --git a/packages/editor/src/runtime/editor/languages/typescript/typecellTypeResolver.ts b/packages/editor/src/runtime/editor/languages/typescript/typecellTypeResolver.ts deleted file mode 100644 index f428d7322..000000000 --- a/packages/editor/src/runtime/editor/languages/typescript/typecellTypeResolver.ts +++ /dev/null @@ -1,170 +0,0 @@ -import type * as monaco from "monaco-editor"; -import { parseIdentifier } from "../../../../identifiers"; -import { detectNewImportsToAcquireTypeFor } from "./typeAcquisition"; -/** - * Uses type definitions emitted by npm run emittypes to the public/types directory. - * Now we can use types from this typecell codebase in the runtime - * - * TODO: if loading multiple modules, we won't reuse underlying types and they will be reloaded from public/types, - * might not be ideal architecture but probably also doesn't have a large impact - */ -async function loadTypecellLibTypes( - moduleName: string, - typecellTypePath: string, - monacoInstance: typeof monaco -) { - const lib = ` - import getExposeGlobalVariables from "${typecellTypePath}"; - let exp: ReturnType; - export default exp; - `; - - monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( - lib, - `file:///node_modules/@types/${moduleName}/index.d.ts` - ); - - await detectNewImportsToAcquireTypeFor( - lib, - monacoInstance.languages.typescript.typescriptDefaults.addExtraLib.bind( - monacoInstance.languages.typescript.typescriptDefaults - ), - window.fetch.bind(window), - console, // TODO - moduleName - ); -} - -function refreshUserModelTypes(folder: string, monacoInstance: typeof monaco) { - // find all typecell scripts in the folder - const models = monacoInstance.editor - .getModels() - .filter((m) => { - let path = m.uri.path; - return ( - path.startsWith(folder) && - (path.endsWith(".tsx") || - (path.endsWith(".ts") && !path.endsWith(".d.ts"))) - ); - }) - .map((m) => m.uri.toString().replace(/(\.ts|\.tsx)$/, "")); - - if (!folder.startsWith("/!@") && !folder.endsWith("/")) { - throw new Error("expected folder to start with / and end with /"); - } - - let content = models.map((f) => `export * from "${f}";`).join("\n"); - - // TODO: we register two libs. Would be nicer to detect the main notebook from imported libs and register them appropriately - - // for main notebook - // register the typings as a node_module in the full folder name (e.g.: !@mx://mx.typecell.org/@abc/abcccc) - // These typings are automatically imported as $ in ts.worker.ts - monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( - content, - `file:///node_modules/@types${folder.replace("//", "/")}index.d.ts` - ); - - // TODO: this is hacky, we should not have a dependency on Identifier here - const identifierStr = folder.substring("/!@".length, folder.length - 1); - const identifier = parseIdentifier(identifierStr); - let packageName = identifier.toRouteString(); - if (!packageName.startsWith("/")) { - throw new Error("expected packageName to start with /"); - } - packageName = "!" + packageName.substring(1); - - // for imported libs - // register the typings as a node_module in the short identifier name (e.g.: !@abc/abcccc) - // These is required when we import a different typecell module using the shorthand (import "!@abc/abcccc") - monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( - content, - `file:///node_modules/@types/${packageName}/index.d.ts` - ); -} - -/** - * This adds OnlyViews and Values to use in ts.worker.ts - */ -function addHelperFiles(monacoInstance: typeof monaco) { - const content = ` -import type * as React from "react"; - -type ReactView = React.ReactElement<{__tcObservable: T}>; - -export type OnlyViews = { - // [E in keyof T as T[E] extends ReactView ? E : never]: T[E]; - [E in keyof T]: T[E] extends ReactView ? T[E] : never; -}; - -export type Values = { - [E in keyof T]: T[E] extends ReactView ? B : T[E]; -}; -`; - // register the typings as a node_module. - // These typings are automatically imported as $ in ts.worker.ts - monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( - content, - `file:///node_modules/@types/typecell-helpers/index.d.ts` - ); -} - -/** - * This exposes the types of the context to the monaco runtime - */ -function listenForTypecellUserModels(monacoInstance: typeof monaco) { - if (monacoInstance.editor.getModels().length > 0) { - // Note / improve: only listens for new models, doesn't inspect already - // registered models. For now ok as it's called on startup (before models are added) - console.error( - "unexpected, listenForTypecellUserModels should be called before models are registered" - ); - } - monacoInstance.editor.onDidCreateModel((model) => { - if (!model.uri.path.startsWith("/!@")) { - return; - } - - model.onDidChangeContent((e) => {}); - const folder = model.uri.path.substring( - 0, - model.uri.path.lastIndexOf("/") + 1 - ); - - refreshUserModelTypes(folder, monacoInstance); - model.onWillDispose(() => { - // console.log("dispose", model.uri.toString()); - refreshUserModelTypes(folder, monacoInstance); - }); - }); -} - -/** - * Registers the types for: - * - user written code and the $ context variable - * - built in helper library - * - * These types are automatically imported in the cell / plugin context, in ts.worker.ts - */ -export default async function setupTypecellTypeResolver( - monacoInstance: typeof monaco -) { - // Loads types for "typecell-plugin" helper library, as defined in pluginEngine/lib/exports - // await loadTypecellLibTypes( - // "typecell-plugin", - // "./pluginEngine/lib/exports", - // monacoInstance - // ).catch(console.error); - - addHelperFiles(monacoInstance); - - // Loads types for $ context variables - listenForTypecellUserModels(monacoInstance); - - // Loads types for standard "typecell" helper library, as defined in typecellEngine/lib/exports - await loadTypecellLibTypes( - "typecell", - "./runtime/executor/lib/exports", - monacoInstance - ).catch(console.error); -} diff --git a/packages/editor/src/runtime/editor/prettier/diff.js b/packages/editor/src/runtime/editor/prettier/diff.js deleted file mode 100644 index 9807162fc..000000000 --- a/packages/editor/src/runtime/editor/prettier/diff.js +++ /dev/null @@ -1,2390 +0,0 @@ -/* eslint-disable */ - -/** - * Diff Match and Patch - * Copyright 2018 The diff-match-patch Authors. - * https://github.com/google/diff-match-patch - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview Computes the difference between two texts to create a patch. - * Applies the patch onto another text, allowing for errors. - * @author fraser@google.com (Neil Fraser) - */ - -/** - * Class containing the diff, match and patch methods. - * @constructor - */ -var diff_match_patch = function () { - // Defaults. - // Redefine these in your program to override the defaults. - - // Number of seconds to map a diff before giving up (0 for infinity). - this.Diff_Timeout = 1.0; - // Cost of an empty edit operation in terms of edit characters. - this.Diff_EditCost = 4; - // At what point is no match declared (0.0 = perfection, 1.0 = very loose). - this.Match_Threshold = 0.5; - // How far to search for a match (0 = exact location, 1000+ = broad match). - // A match this many characters away from the expected location will add - // 1.0 to the score (0.0 is a perfect match). - this.Match_Distance = 1000; - // When deleting a large block of text (over ~64 characters), how close do - // the contents have to be to match the expected contents. (0.0 = perfection, - // 1.0 = very loose). Note that Match_Threshold controls how closely the - // end points of a delete need to match. - this.Patch_DeleteThreshold = 0.5; - // Chunk size for context length. - this.Patch_Margin = 4; - - // The number of bits in an int. - this.Match_MaxBits = 32; -}; - -// DIFF FUNCTIONS - -/** - * The data structure representing a diff is an array of tuples: - * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] - * which means: delete 'Hello', add 'Goodbye' and keep ' world.' - */ -var DIFF_DELETE = -1; -var DIFF_INSERT = 1; -var DIFF_EQUAL = 0; - -/** - * Class representing one diff tuple. - * Attempts to look like a two-element array (which is what this used to be). - * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL. - * @param {string} text Text to be deleted, inserted, or retained. - * @constructor - */ -diff_match_patch.Diff = function (op, text) { - this[0] = op; - this[1] = text; -}; - -diff_match_patch.Diff.prototype.length = 2; - -/** - * Emulate the output of a two-element array. - * @return {string} Diff operation as a string. - */ -diff_match_patch.Diff.prototype.toString = function () { - return this[0] + "," + this[1]; -}; - -/** - * Find the differences between two texts. Simplifies the problem by stripping - * any common prefix or suffix off the texts before diffing. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {boolean=} opt_checklines Optional speedup flag. If present and false, - * then don't run a line-level diff first to identify the changed areas. - * Defaults to true, which does a faster, slightly less optimal diff. - * @param {number=} opt_deadline Optional time when the diff should be complete - * by. Used internally for recursive calls. Users should set DiffTimeout - * instead. - * @return {!Array.} Array of diff tuples. - */ -diff_match_patch.prototype.diff_main = function ( - text1, - text2, - opt_checklines, - opt_deadline -) { - // Set a deadline by which time the diff must be complete. - if (typeof opt_deadline == "undefined") { - if (this.Diff_Timeout <= 0) { - opt_deadline = Number.MAX_VALUE; - } else { - opt_deadline = new Date().getTime() + this.Diff_Timeout * 1000; - } - } - var deadline = opt_deadline; - - // Check for null inputs. - if (text1 == null || text2 == null) { - throw new Error("Null input. (diff_main)"); - } - - // Check for equality (speedup). - if (text1 == text2) { - if (text1) { - return [new diff_match_patch.Diff(DIFF_EQUAL, text1)]; - } - return []; - } - - if (typeof opt_checklines == "undefined") { - opt_checklines = true; - } - var checklines = opt_checklines; - - // Trim off common prefix (speedup). - var commonlength = this.diff_commonPrefix(text1, text2); - var commonprefix = text1.substring(0, commonlength); - text1 = text1.substring(commonlength); - text2 = text2.substring(commonlength); - - // Trim off common suffix (speedup). - commonlength = this.diff_commonSuffix(text1, text2); - var commonsuffix = text1.substring(text1.length - commonlength); - text1 = text1.substring(0, text1.length - commonlength); - text2 = text2.substring(0, text2.length - commonlength); - - // Compute the diff on the middle block. - var diffs = this.diff_compute_(text1, text2, checklines, deadline); - - // Restore the prefix and suffix. - if (commonprefix) { - diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix)); - } - if (commonsuffix) { - diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix)); - } - this.diff_cleanupMerge(diffs); - return diffs; -}; - -/** - * Find the differences between two texts. Assumes that the texts do not - * have any common prefix or suffix. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {boolean} checklines Speedup flag. If false, then don't run a - * line-level diff first to identify the changed areas. - * If true, then run a faster, slightly less optimal diff. - * @param {number} deadline Time when the diff should be complete by. - * @return {!Array.} Array of diff tuples. - * @private - */ -diff_match_patch.prototype.diff_compute_ = function ( - text1, - text2, - checklines, - deadline -) { - var diffs; - - if (!text1) { - // Just add some text (speedup). - return [new diff_match_patch.Diff(DIFF_INSERT, text2)]; - } - - if (!text2) { - // Just delete some text (speedup). - return [new diff_match_patch.Diff(DIFF_DELETE, text1)]; - } - - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - var i = longtext.indexOf(shorttext); - if (i != -1) { - // Shorter text is inside the longer text (speedup). - diffs = [ - new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)), - new diff_match_patch.Diff(DIFF_EQUAL, shorttext), - new diff_match_patch.Diff( - DIFF_INSERT, - longtext.substring(i + shorttext.length) - ), - ]; - // Swap insertions for deletions if diff is reversed. - if (text1.length > text2.length) { - diffs[0][0] = diffs[2][0] = DIFF_DELETE; - } - return diffs; - } - - if (shorttext.length == 1) { - // Single character string. - // After the previous speedup, the character can't be an equality. - return [ - new diff_match_patch.Diff(DIFF_DELETE, text1), - new diff_match_patch.Diff(DIFF_INSERT, text2), - ]; - } - - // Check to see if the problem can be split in two. - var hm = this.diff_halfMatch_(text1, text2); - if (hm) { - // A half-match was found, sort out the return data. - var text1_a = hm[0]; - var text1_b = hm[1]; - var text2_a = hm[2]; - var text2_b = hm[3]; - var mid_common = hm[4]; - // Send both pairs off for separate processing. - var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline); - var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline); - // Merge the results. - return diffs_a.concat( - [new diff_match_patch.Diff(DIFF_EQUAL, mid_common)], - diffs_b - ); - } - - if (checklines && text1.length > 100 && text2.length > 100) { - return this.diff_lineMode_(text1, text2, deadline); - } - - return this.diff_bisect_(text1, text2, deadline); -}; - -/** - * Do a quick line-level diff on both strings, then rediff the parts for - * greater accuracy. - * This speedup can produce non-minimal diffs. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {number} deadline Time when the diff should be complete by. - * @return {!Array.} Array of diff tuples. - * @private - */ -diff_match_patch.prototype.diff_lineMode_ = function (text1, text2, deadline) { - // Scan the text on a line-by-line basis first. - var a = this.diff_linesToChars_(text1, text2); - text1 = a.chars1; - text2 = a.chars2; - var linearray = a.lineArray; - - var diffs = this.diff_main(text1, text2, false, deadline); - - // Convert the diff back to original text. - this.diff_charsToLines_(diffs, linearray); - // Eliminate freak matches (e.g. blank lines) - this.diff_cleanupSemantic(diffs); - - // Rediff any replacement blocks, this time character-by-character. - // Add a dummy entry at the end. - diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, "")); - var pointer = 0; - var count_delete = 0; - var count_insert = 0; - var text_delete = ""; - var text_insert = ""; - while (pointer < diffs.length) { - switch (diffs[pointer][0]) { - case DIFF_INSERT: - count_insert++; - text_insert += diffs[pointer][1]; - break; - case DIFF_DELETE: - count_delete++; - text_delete += diffs[pointer][1]; - break; - case DIFF_EQUAL: - // Upon reaching an equality, check for prior redundancies. - if (count_delete >= 1 && count_insert >= 1) { - // Delete the offending records and add the merged ones. - diffs.splice( - pointer - count_delete - count_insert, - count_delete + count_insert - ); - pointer = pointer - count_delete - count_insert; - var subDiff = this.diff_main( - text_delete, - text_insert, - false, - deadline - ); - for (var j = subDiff.length - 1; j >= 0; j--) { - diffs.splice(pointer, 0, subDiff[j]); - } - pointer = pointer + subDiff.length; - } - count_insert = 0; - count_delete = 0; - text_delete = ""; - text_insert = ""; - break; - } - pointer++; - } - diffs.pop(); // Remove the dummy entry at the end. - - return diffs; -}; - -/** - * Find the 'middle snake' of a diff, split the problem in two - * and return the recursively constructed diff. - * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {number} deadline Time at which to bail if not yet complete. - * @return {!Array.} Array of diff tuples. - * @private - */ -diff_match_patch.prototype.diff_bisect_ = function (text1, text2, deadline) { - // Cache the text lengths to prevent multiple calls. - var text1_length = text1.length; - var text2_length = text2.length; - var max_d = Math.ceil((text1_length + text2_length) / 2); - var v_offset = max_d; - var v_length = 2 * max_d; - var v1 = new Array(v_length); - var v2 = new Array(v_length); - // Setting all elements to -1 is faster in Chrome & Firefox than mixing - // integers and undefined. - for (var x = 0; x < v_length; x++) { - v1[x] = -1; - v2[x] = -1; - } - v1[v_offset + 1] = 0; - v2[v_offset + 1] = 0; - var delta = text1_length - text2_length; - // If the total number of characters is odd, then the front path will collide - // with the reverse path. - var front = delta % 2 != 0; - // Offsets for start and end of k loop. - // Prevents mapping of space beyond the grid. - var k1start = 0; - var k1end = 0; - var k2start = 0; - var k2end = 0; - for (var d = 0; d < max_d; d++) { - // Bail out if deadline is reached. - if (new Date().getTime() > deadline) { - break; - } - - // Walk the front path one step. - for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { - var k1_offset = v_offset + k1; - var x1; - if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) { - x1 = v1[k1_offset + 1]; - } else { - x1 = v1[k1_offset - 1] + 1; - } - var y1 = x1 - k1; - while ( - x1 < text1_length && - y1 < text2_length && - text1.charAt(x1) == text2.charAt(y1) - ) { - x1++; - y1++; - } - v1[k1_offset] = x1; - if (x1 > text1_length) { - // Ran off the right of the graph. - k1end += 2; - } else if (y1 > text2_length) { - // Ran off the bottom of the graph. - k1start += 2; - } else if (front) { - var k2_offset = v_offset + delta - k1; - if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { - // Mirror x2 onto top-left coordinate system. - var x2 = text1_length - v2[k2_offset]; - if (x1 >= x2) { - // Overlap detected. - return this.diff_bisectSplit_(text1, text2, x1, y1, deadline); - } - } - } - } - - // Walk the reverse path one step. - for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { - var k2_offset = v_offset + k2; - var x2; - if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) { - x2 = v2[k2_offset + 1]; - } else { - x2 = v2[k2_offset - 1] + 1; - } - var y2 = x2 - k2; - while ( - x2 < text1_length && - y2 < text2_length && - text1.charAt(text1_length - x2 - 1) == - text2.charAt(text2_length - y2 - 1) - ) { - x2++; - y2++; - } - v2[k2_offset] = x2; - if (x2 > text1_length) { - // Ran off the left of the graph. - k2end += 2; - } else if (y2 > text2_length) { - // Ran off the top of the graph. - k2start += 2; - } else if (!front) { - var k1_offset = v_offset + delta - k2; - if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { - var x1 = v1[k1_offset]; - var y1 = v_offset + x1 - k1_offset; - // Mirror x2 onto top-left coordinate system. - x2 = text1_length - x2; - if (x1 >= x2) { - // Overlap detected. - return this.diff_bisectSplit_(text1, text2, x1, y1, deadline); - } - } - } - } - } - // Diff took too long and hit the deadline or - // number of diffs equals number of characters, no commonality at all. - return [ - new diff_match_patch.Diff(DIFF_DELETE, text1), - new diff_match_patch.Diff(DIFF_INSERT, text2), - ]; -}; - -/** - * Given the location of the 'middle snake', split the diff in two parts - * and recurse. - * @param {string} text1 Old string to be diffed. - * @param {string} text2 New string to be diffed. - * @param {number} x Index of split point in text1. - * @param {number} y Index of split point in text2. - * @param {number} deadline Time at which to bail if not yet complete. - * @return {!Array.} Array of diff tuples. - * @private - */ -diff_match_patch.prototype.diff_bisectSplit_ = function ( - text1, - text2, - x, - y, - deadline -) { - var text1a = text1.substring(0, x); - var text2a = text2.substring(0, y); - var text1b = text1.substring(x); - var text2b = text2.substring(y); - - // Compute both diffs serially. - var diffs = this.diff_main(text1a, text2a, false, deadline); - var diffsb = this.diff_main(text1b, text2b, false, deadline); - - return diffs.concat(diffsb); -}; - -/** - * Split two texts into an array of strings. Reduce the texts to a string of - * hashes where each Unicode character represents one line. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {{chars1: string, chars2: string, lineArray: !Array.}} - * An object containing the encoded text1, the encoded text2 and - * the array of unique strings. - * The zeroth element of the array of unique strings is intentionally blank. - * @private - */ -diff_match_patch.prototype.diff_linesToChars_ = function (text1, text2) { - var lineArray = []; // e.g. lineArray[4] == 'Hello\n' - var lineHash = {}; // e.g. lineHash['Hello\n'] == 4 - - // '\x00' is a valid character, but various debuggers don't like it. - // So we'll insert a junk entry to avoid generating a null character. - lineArray[0] = ""; - - /** - * Split a text into an array of strings. Reduce the texts to a string of - * hashes where each Unicode character represents one line. - * Modifies linearray and linehash through being a closure. - * @param {string} text String to encode. - * @return {string} Encoded string. - * @private - */ - function diff_linesToCharsMunge_(text) { - var chars = ""; - // Walk the text, pulling out a substring for each line. - // text.split('\n') would would temporarily double our memory footprint. - // Modifying text would create many large strings to garbage collect. - var lineStart = 0; - var lineEnd = -1; - // Keeping our own length variable is faster than looking it up. - var lineArrayLength = lineArray.length; - while (lineEnd < text.length - 1) { - lineEnd = text.indexOf("\n", lineStart); - if (lineEnd == -1) { - lineEnd = text.length - 1; - } - var line = text.substring(lineStart, lineEnd + 1); - - if ( - lineHash.hasOwnProperty - ? lineHash.hasOwnProperty(line) - : lineHash[line] !== undefined - ) { - chars += String.fromCharCode(lineHash[line]); - } else { - if (lineArrayLength == maxLines) { - // Bail out at 65535 because - // String.fromCharCode(65536) == String.fromCharCode(0) - line = text.substring(lineStart); - lineEnd = text.length; - } - chars += String.fromCharCode(lineArrayLength); - lineHash[line] = lineArrayLength; - lineArray[lineArrayLength++] = line; - } - lineStart = lineEnd + 1; - } - return chars; - } - // Allocate 2/3rds of the space for text1, the rest for text2. - var maxLines = 40000; - var chars1 = diff_linesToCharsMunge_(text1); - maxLines = 65535; - var chars2 = diff_linesToCharsMunge_(text2); - return { chars1: chars1, chars2: chars2, lineArray: lineArray }; -}; - -/** - * Rehydrate the text in a diff from a string of line hashes to real lines of - * text. - * @param {!Array.} diffs Array of diff tuples. - * @param {!Array.} lineArray Array of unique strings. - * @private - */ -diff_match_patch.prototype.diff_charsToLines_ = function (diffs, lineArray) { - for (var i = 0; i < diffs.length; i++) { - var chars = diffs[i][1]; - var text = []; - for (var j = 0; j < chars.length; j++) { - text[j] = lineArray[chars.charCodeAt(j)]; - } - diffs[i][1] = text.join(""); - } -}; - -/** - * Determine the common prefix of two strings. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {number} The number of characters common to the start of each - * string. - */ -diff_match_patch.prototype.diff_commonPrefix = function (text1, text2) { - // Quick check for common null cases. - if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) { - return 0; - } - // Binary search. - // Performance analysis: https://neil.fraser.name/news/2007/10/09/ - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerstart = 0; - while (pointermin < pointermid) { - if ( - text1.substring(pointerstart, pointermid) == - text2.substring(pointerstart, pointermid) - ) { - pointermin = pointermid; - pointerstart = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - return pointermid; -}; - -/** - * Determine the common suffix of two strings. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {number} The number of characters common to the end of each string. - */ -diff_match_patch.prototype.diff_commonSuffix = function (text1, text2) { - // Quick check for common null cases. - if ( - !text1 || - !text2 || - text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1) - ) { - return 0; - } - // Binary search. - // Performance analysis: https://neil.fraser.name/news/2007/10/09/ - var pointermin = 0; - var pointermax = Math.min(text1.length, text2.length); - var pointermid = pointermax; - var pointerend = 0; - while (pointermin < pointermid) { - if ( - text1.substring(text1.length - pointermid, text1.length - pointerend) == - text2.substring(text2.length - pointermid, text2.length - pointerend) - ) { - pointermin = pointermid; - pointerend = pointermin; - } else { - pointermax = pointermid; - } - pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); - } - return pointermid; -}; - -/** - * Determine if the suffix of one string is the prefix of another. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {number} The number of characters common to the end of the first - * string and the start of the second string. - * @private - */ -diff_match_patch.prototype.diff_commonOverlap_ = function (text1, text2) { - // Cache the text lengths to prevent multiple calls. - var text1_length = text1.length; - var text2_length = text2.length; - // Eliminate the null case. - if (text1_length == 0 || text2_length == 0) { - return 0; - } - // Truncate the longer string. - if (text1_length > text2_length) { - text1 = text1.substring(text1_length - text2_length); - } else if (text1_length < text2_length) { - text2 = text2.substring(0, text1_length); - } - var text_length = Math.min(text1_length, text2_length); - // Quick check for the worst case. - if (text1 == text2) { - return text_length; - } - - // Start by looking for a single character match - // and increase length until no match is found. - // Performance analysis: https://neil.fraser.name/news/2010/11/04/ - var best = 0; - var length = 1; - while (true) { - var pattern = text1.substring(text_length - length); - var found = text2.indexOf(pattern); - if (found == -1) { - return best; - } - length += found; - if ( - found == 0 || - text1.substring(text_length - length) == text2.substring(0, length) - ) { - best = length; - length++; - } - } -}; - -/** - * Do the two texts share a substring which is at least half the length of the - * longer text? - * This speedup can produce non-minimal diffs. - * @param {string} text1 First string. - * @param {string} text2 Second string. - * @return {Array.} Five element Array, containing the prefix of - * text1, the suffix of text1, the prefix of text2, the suffix of - * text2 and the common middle. Or null if there was no match. - * @private - */ -diff_match_patch.prototype.diff_halfMatch_ = function (text1, text2) { - if (this.Diff_Timeout <= 0) { - // Don't risk returning a non-optimal diff if we have unlimited time. - return null; - } - var longtext = text1.length > text2.length ? text1 : text2; - var shorttext = text1.length > text2.length ? text2 : text1; - if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { - return null; // Pointless. - } - var dmp = this; // 'this' becomes 'window' in a closure. - - /** - * Does a substring of shorttext exist within longtext such that the substring - * is at least half the length of longtext? - * Closure, but does not reference any external variables. - * @param {string} longtext Longer string. - * @param {string} shorttext Shorter string. - * @param {number} i Start index of quarter length substring within longtext. - * @return {Array.} Five element Array, containing the prefix of - * longtext, the suffix of longtext, the prefix of shorttext, the suffix - * of shorttext and the common middle. Or null if there was no match. - * @private - */ - function diff_halfMatchI_(longtext, shorttext, i) { - // Start with a 1/4 length substring at position i as a seed. - var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); - var j = -1; - var best_common = ""; - var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; - while ((j = shorttext.indexOf(seed, j + 1)) != -1) { - var prefixLength = dmp.diff_commonPrefix( - longtext.substring(i), - shorttext.substring(j) - ); - var suffixLength = dmp.diff_commonSuffix( - longtext.substring(0, i), - shorttext.substring(0, j) - ); - if (best_common.length < suffixLength + prefixLength) { - best_common = - shorttext.substring(j - suffixLength, j) + - shorttext.substring(j, j + prefixLength); - best_longtext_a = longtext.substring(0, i - suffixLength); - best_longtext_b = longtext.substring(i + prefixLength); - best_shorttext_a = shorttext.substring(0, j - suffixLength); - best_shorttext_b = shorttext.substring(j + prefixLength); - } - } - if (best_common.length * 2 >= longtext.length) { - return [ - best_longtext_a, - best_longtext_b, - best_shorttext_a, - best_shorttext_b, - best_common, - ]; - } else { - return null; - } - } - - // First check if the second quarter is the seed for a half-match. - var hm1 = diff_halfMatchI_( - longtext, - shorttext, - Math.ceil(longtext.length / 4) - ); - // Check again based on the third quarter. - var hm2 = diff_halfMatchI_( - longtext, - shorttext, - Math.ceil(longtext.length / 2) - ); - var hm; - if (!hm1 && !hm2) { - return null; - } else if (!hm2) { - hm = hm1; - } else if (!hm1) { - hm = hm2; - } else { - // Both matched. Select the longest. - hm = hm1[4].length > hm2[4].length ? hm1 : hm2; - } - - // A half-match was found, sort out the return data. - var text1_a, text1_b, text2_a, text2_b; - if (text1.length > text2.length) { - text1_a = hm[0]; - text1_b = hm[1]; - text2_a = hm[2]; - text2_b = hm[3]; - } else { - text2_a = hm[0]; - text2_b = hm[1]; - text1_a = hm[2]; - text1_b = hm[3]; - } - var mid_common = hm[4]; - return [text1_a, text1_b, text2_a, text2_b, mid_common]; -}; - -/** - * Reduce the number of edits by eliminating semantically trivial equalities. - * @param {!Array.} diffs Array of diff tuples. - */ -diff_match_patch.prototype.diff_cleanupSemantic = function (diffs) { - var changes = false; - var equalities = []; // Stack of indices where equalities are found. - var equalitiesLength = 0; // Keeping our own length var is faster in JS. - /** @type {?string} */ - var lastEquality = null; - // Always equal to diffs[equalities[equalitiesLength - 1]][1] - var pointer = 0; // Index of current position. - // Number of characters that changed prior to the equality. - var length_insertions1 = 0; - var length_deletions1 = 0; - // Number of characters that changed after the equality. - var length_insertions2 = 0; - var length_deletions2 = 0; - while (pointer < diffs.length) { - if (diffs[pointer][0] == DIFF_EQUAL) { - // Equality found. - equalities[equalitiesLength++] = pointer; - length_insertions1 = length_insertions2; - length_deletions1 = length_deletions2; - length_insertions2 = 0; - length_deletions2 = 0; - lastEquality = diffs[pointer][1]; - } else { - // An insertion or deletion. - if (diffs[pointer][0] == DIFF_INSERT) { - length_insertions2 += diffs[pointer][1].length; - } else { - length_deletions2 += diffs[pointer][1].length; - } - // Eliminate an equality that is smaller or equal to the edits on both - // sides of it. - if ( - lastEquality && - lastEquality.length <= - Math.max(length_insertions1, length_deletions1) && - lastEquality.length <= Math.max(length_insertions2, length_deletions2) - ) { - // Duplicate record. - diffs.splice( - equalities[equalitiesLength - 1], - 0, - new diff_match_patch.Diff(DIFF_DELETE, lastEquality) - ); - // Change second copy to insert. - diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; - // Throw away the equality we just deleted. - equalitiesLength--; - // Throw away the previous equality (it needs to be reevaluated). - equalitiesLength--; - pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; - length_insertions1 = 0; // Reset the counters. - length_deletions1 = 0; - length_insertions2 = 0; - length_deletions2 = 0; - lastEquality = null; - changes = true; - } - } - pointer++; - } - - // Normalize the diff. - if (changes) { - this.diff_cleanupMerge(diffs); - } - this.diff_cleanupSemanticLossless(diffs); - - // Find any overlaps between deletions and insertions. - // e.g: abcxxxxxxdef - // -> abcxxxdef - // e.g: xxxabcdefxxx - // -> defxxxabc - // Only extract an overlap if it is as big as the edit ahead or behind it. - pointer = 1; - while (pointer < diffs.length) { - if ( - diffs[pointer - 1][0] == DIFF_DELETE && - diffs[pointer][0] == DIFF_INSERT - ) { - var deletion = diffs[pointer - 1][1]; - var insertion = diffs[pointer][1]; - var overlap_length1 = this.diff_commonOverlap_(deletion, insertion); - var overlap_length2 = this.diff_commonOverlap_(insertion, deletion); - if (overlap_length1 >= overlap_length2) { - if ( - overlap_length1 >= deletion.length / 2 || - overlap_length1 >= insertion.length / 2 - ) { - // Overlap found. Insert an equality and trim the surrounding edits. - diffs.splice( - pointer, - 0, - new diff_match_patch.Diff( - DIFF_EQUAL, - insertion.substring(0, overlap_length1) - ) - ); - diffs[pointer - 1][1] = deletion.substring( - 0, - deletion.length - overlap_length1 - ); - diffs[pointer + 1][1] = insertion.substring(overlap_length1); - pointer++; - } - } else { - if ( - overlap_length2 >= deletion.length / 2 || - overlap_length2 >= insertion.length / 2 - ) { - // Reverse overlap found. - // Insert an equality and swap and trim the surrounding edits. - diffs.splice( - pointer, - 0, - new diff_match_patch.Diff( - DIFF_EQUAL, - deletion.substring(0, overlap_length2) - ) - ); - diffs[pointer - 1][0] = DIFF_INSERT; - diffs[pointer - 1][1] = insertion.substring( - 0, - insertion.length - overlap_length2 - ); - diffs[pointer + 1][0] = DIFF_DELETE; - diffs[pointer + 1][1] = deletion.substring(overlap_length2); - pointer++; - } - } - pointer++; - } - pointer++; - } -}; - -/** - * Look for single edits surrounded on both sides by equalities - * which can be shifted sideways to align the edit to a word boundary. - * e.g: The cat came. -> The cat came. - * @param {!Array.} diffs Array of diff tuples. - */ -diff_match_patch.prototype.diff_cleanupSemanticLossless = function (diffs) { - /** - * Given two strings, compute a score representing whether the internal - * boundary falls on logical boundaries. - * Scores range from 6 (best) to 0 (worst). - * Closure, but does not reference any external variables. - * @param {string} one First string. - * @param {string} two Second string. - * @return {number} The score. - * @private - */ - function diff_cleanupSemanticScore_(one, two) { - if (!one || !two) { - // Edges are the best. - return 6; - } - - // Each port of this function behaves slightly differently due to - // subtle differences in each language's definition of things like - // 'whitespace'. Since this function's purpose is largely cosmetic, - // the choice has been made to use each language's native features - // rather than force total conformity. - var char1 = one.charAt(one.length - 1); - var char2 = two.charAt(0); - var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_); - var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_); - var whitespace1 = - nonAlphaNumeric1 && char1.match(diff_match_patch.whitespaceRegex_); - var whitespace2 = - nonAlphaNumeric2 && char2.match(diff_match_patch.whitespaceRegex_); - var lineBreak1 = - whitespace1 && char1.match(diff_match_patch.linebreakRegex_); - var lineBreak2 = - whitespace2 && char2.match(diff_match_patch.linebreakRegex_); - var blankLine1 = - lineBreak1 && one.match(diff_match_patch.blanklineEndRegex_); - var blankLine2 = - lineBreak2 && two.match(diff_match_patch.blanklineStartRegex_); - - if (blankLine1 || blankLine2) { - // Five points for blank lines. - return 5; - } else if (lineBreak1 || lineBreak2) { - // Four points for line breaks. - return 4; - } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) { - // Three points for end of sentences. - return 3; - } else if (whitespace1 || whitespace2) { - // Two points for whitespace. - return 2; - } else if (nonAlphaNumeric1 || nonAlphaNumeric2) { - // One point for non-alphanumeric. - return 1; - } - return 0; - } - - var pointer = 1; - // Intentionally ignore the first and last element (don't need checking). - while (pointer < diffs.length - 1) { - if ( - diffs[pointer - 1][0] == DIFF_EQUAL && - diffs[pointer + 1][0] == DIFF_EQUAL - ) { - // This is a single edit surrounded by equalities. - var equality1 = diffs[pointer - 1][1]; - var edit = diffs[pointer][1]; - var equality2 = diffs[pointer + 1][1]; - - // First, shift the edit as far left as possible. - var commonOffset = this.diff_commonSuffix(equality1, edit); - if (commonOffset) { - var commonString = edit.substring(edit.length - commonOffset); - equality1 = equality1.substring(0, equality1.length - commonOffset); - edit = commonString + edit.substring(0, edit.length - commonOffset); - equality2 = commonString + equality2; - } - - // Second, step character by character right, looking for the best fit. - var bestEquality1 = equality1; - var bestEdit = edit; - var bestEquality2 = equality2; - var bestScore = - diff_cleanupSemanticScore_(equality1, edit) + - diff_cleanupSemanticScore_(edit, equality2); - while (edit.charAt(0) === equality2.charAt(0)) { - equality1 += edit.charAt(0); - edit = edit.substring(1) + equality2.charAt(0); - equality2 = equality2.substring(1); - var score = - diff_cleanupSemanticScore_(equality1, edit) + - diff_cleanupSemanticScore_(edit, equality2); - // The >= encourages trailing rather than leading whitespace on edits. - if (score >= bestScore) { - bestScore = score; - bestEquality1 = equality1; - bestEdit = edit; - bestEquality2 = equality2; - } - } - - if (diffs[pointer - 1][1] != bestEquality1) { - // We have an improvement, save it back to the diff. - if (bestEquality1) { - diffs[pointer - 1][1] = bestEquality1; - } else { - diffs.splice(pointer - 1, 1); - pointer--; - } - diffs[pointer][1] = bestEdit; - if (bestEquality2) { - diffs[pointer + 1][1] = bestEquality2; - } else { - diffs.splice(pointer + 1, 1); - pointer--; - } - } - } - pointer++; - } -}; - -// Define some regex patterns for matching boundaries. -diff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/; -diff_match_patch.whitespaceRegex_ = /\s/; -diff_match_patch.linebreakRegex_ = /[\r\n]/; -diff_match_patch.blanklineEndRegex_ = /\n\r?\n$/; -diff_match_patch.blanklineStartRegex_ = /^\r?\n\r?\n/; - -/** - * Reduce the number of edits by eliminating operationally trivial equalities. - * @param {!Array.} diffs Array of diff tuples. - */ -diff_match_patch.prototype.diff_cleanupEfficiency = function (diffs) { - var changes = false; - var equalities = []; // Stack of indices where equalities are found. - var equalitiesLength = 0; // Keeping our own length var is faster in JS. - /** @type {?string} */ - var lastEquality = null; - // Always equal to diffs[equalities[equalitiesLength - 1]][1] - var pointer = 0; // Index of current position. - // Is there an insertion operation before the last equality. - var pre_ins = false; - // Is there a deletion operation before the last equality. - var pre_del = false; - // Is there an insertion operation after the last equality. - var post_ins = false; - // Is there a deletion operation after the last equality. - var post_del = false; - while (pointer < diffs.length) { - if (diffs[pointer][0] == DIFF_EQUAL) { - // Equality found. - if ( - diffs[pointer][1].length < this.Diff_EditCost && - (post_ins || post_del) - ) { - // Candidate found. - equalities[equalitiesLength++] = pointer; - pre_ins = post_ins; - pre_del = post_del; - lastEquality = diffs[pointer][1]; - } else { - // Not a candidate, and can never become one. - equalitiesLength = 0; - lastEquality = null; - } - post_ins = post_del = false; - } else { - // An insertion or deletion. - if (diffs[pointer][0] == DIFF_DELETE) { - post_del = true; - } else { - post_ins = true; - } - /* - * Five types to be split: - * ABXYCD - * AXCD - * ABXC - * AXCD - * ABXC - */ - if ( - lastEquality && - ((pre_ins && pre_del && post_ins && post_del) || - (lastEquality.length < this.Diff_EditCost / 2 && - pre_ins + pre_del + post_ins + post_del == 3)) - ) { - // Duplicate record. - diffs.splice( - equalities[equalitiesLength - 1], - 0, - new diff_match_patch.Diff(DIFF_DELETE, lastEquality) - ); - // Change second copy to insert. - diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; - equalitiesLength--; // Throw away the equality we just deleted; - lastEquality = null; - if (pre_ins && pre_del) { - // No changes made which could affect previous entry, keep going. - post_ins = post_del = true; - equalitiesLength = 0; - } else { - equalitiesLength--; // Throw away the previous equality. - pointer = - equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; - post_ins = post_del = false; - } - changes = true; - } - } - pointer++; - } - - if (changes) { - this.diff_cleanupMerge(diffs); - } -}; - -/** - * Reorder and merge like edit sections. Merge equalities. - * Any edit section can move as long as it doesn't cross an equality. - * @param {!Array.} diffs Array of diff tuples. - */ -diff_match_patch.prototype.diff_cleanupMerge = function (diffs) { - // Add a dummy entry at the end. - diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, "")); - var pointer = 0; - var count_delete = 0; - var count_insert = 0; - var text_delete = ""; - var text_insert = ""; - var commonlength; - while (pointer < diffs.length) { - switch (diffs[pointer][0]) { - case DIFF_INSERT: - count_insert++; - text_insert += diffs[pointer][1]; - pointer++; - break; - case DIFF_DELETE: - count_delete++; - text_delete += diffs[pointer][1]; - pointer++; - break; - case DIFF_EQUAL: - // Upon reaching an equality, check for prior redundancies. - if (count_delete + count_insert > 1) { - if (count_delete !== 0 && count_insert !== 0) { - // Factor out any common prefixies. - commonlength = this.diff_commonPrefix(text_insert, text_delete); - if (commonlength !== 0) { - if ( - pointer - count_delete - count_insert > 0 && - diffs[pointer - count_delete - count_insert - 1][0] == - DIFF_EQUAL - ) { - diffs[pointer - count_delete - count_insert - 1][1] += - text_insert.substring(0, commonlength); - } else { - diffs.splice( - 0, - 0, - new diff_match_patch.Diff( - DIFF_EQUAL, - text_insert.substring(0, commonlength) - ) - ); - pointer++; - } - text_insert = text_insert.substring(commonlength); - text_delete = text_delete.substring(commonlength); - } - // Factor out any common suffixies. - commonlength = this.diff_commonSuffix(text_insert, text_delete); - if (commonlength !== 0) { - diffs[pointer][1] = - text_insert.substring(text_insert.length - commonlength) + - diffs[pointer][1]; - text_insert = text_insert.substring( - 0, - text_insert.length - commonlength - ); - text_delete = text_delete.substring( - 0, - text_delete.length - commonlength - ); - } - } - // Delete the offending records and add the merged ones. - pointer -= count_delete + count_insert; - diffs.splice(pointer, count_delete + count_insert); - if (text_delete.length) { - diffs.splice( - pointer, - 0, - new diff_match_patch.Diff(DIFF_DELETE, text_delete) - ); - pointer++; - } - if (text_insert.length) { - diffs.splice( - pointer, - 0, - new diff_match_patch.Diff(DIFF_INSERT, text_insert) - ); - pointer++; - } - pointer++; - } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) { - // Merge this equality with the previous one. - diffs[pointer - 1][1] += diffs[pointer][1]; - diffs.splice(pointer, 1); - } else { - pointer++; - } - count_insert = 0; - count_delete = 0; - text_delete = ""; - text_insert = ""; - break; - } - } - if (diffs[diffs.length - 1][1] === "") { - diffs.pop(); // Remove the dummy entry at the end. - } - - // Second pass: look for single edits surrounded on both sides by equalities - // which can be shifted sideways to eliminate an equality. - // e.g: ABAC -> ABAC - var changes = false; - pointer = 1; - // Intentionally ignore the first and last element (don't need checking). - while (pointer < diffs.length - 1) { - if ( - diffs[pointer - 1][0] == DIFF_EQUAL && - diffs[pointer + 1][0] == DIFF_EQUAL - ) { - // This is a single edit surrounded by equalities. - if ( - diffs[pointer][1].substring( - diffs[pointer][1].length - diffs[pointer - 1][1].length - ) == diffs[pointer - 1][1] - ) { - // Shift the edit over the previous equality. - diffs[pointer][1] = - diffs[pointer - 1][1] + - diffs[pointer][1].substring( - 0, - diffs[pointer][1].length - diffs[pointer - 1][1].length - ); - diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; - diffs.splice(pointer - 1, 1); - changes = true; - } else if ( - diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == - diffs[pointer + 1][1] - ) { - // Shift the edit over the next equality. - diffs[pointer - 1][1] += diffs[pointer + 1][1]; - diffs[pointer][1] = - diffs[pointer][1].substring(diffs[pointer + 1][1].length) + - diffs[pointer + 1][1]; - diffs.splice(pointer + 1, 1); - changes = true; - } - } - pointer++; - } - // If shifts were made, the diff needs reordering and another shift sweep. - if (changes) { - this.diff_cleanupMerge(diffs); - } -}; - -/** - * loc is a location in text1, compute and return the equivalent location in - * text2. - * e.g. 'The cat' vs 'The big cat', 1->1, 5->8 - * @param {!Array.} diffs Array of diff tuples. - * @param {number} loc Location within text1. - * @return {number} Location within text2. - */ -diff_match_patch.prototype.diff_xIndex = function (diffs, loc) { - var chars1 = 0; - var chars2 = 0; - var last_chars1 = 0; - var last_chars2 = 0; - var x; - for (x = 0; x < diffs.length; x++) { - if (diffs[x][0] !== DIFF_INSERT) { - // Equality or deletion. - chars1 += diffs[x][1].length; - } - if (diffs[x][0] !== DIFF_DELETE) { - // Equality or insertion. - chars2 += diffs[x][1].length; - } - if (chars1 > loc) { - // Overshot the location. - break; - } - last_chars1 = chars1; - last_chars2 = chars2; - } - // Was the location was deleted? - if (diffs.length != x && diffs[x][0] === DIFF_DELETE) { - return last_chars2; - } - // Add the remaining character length. - return last_chars2 + (loc - last_chars1); -}; - -/** - * Convert a diff array into a pretty HTML report. - * @param {!Array.} diffs Array of diff tuples. - * @return {string} HTML representation. - */ -diff_match_patch.prototype.diff_prettyHtml = function (diffs) { - var html = []; - var pattern_amp = /&/g; - var pattern_lt = //g; - var pattern_para = /\n/g; - for (var x = 0; x < diffs.length; x++) { - var op = diffs[x][0]; // Operation (insert, delete, equal) - var data = diffs[x][1]; // Text of change. - var text = data - .replace(pattern_amp, "&") - .replace(pattern_lt, "<") - .replace(pattern_gt, ">") - .replace(pattern_para, "¶
"); - switch (op) { - case DIFF_INSERT: - html[x] = '' + text + ""; - break; - case DIFF_DELETE: - html[x] = '' + text + ""; - break; - case DIFF_EQUAL: - html[x] = "" + text + ""; - break; - } - } - return html.join(""); -}; - -/** - * Compute and return the source text (all equalities and deletions). - * @param {!Array.} diffs Array of diff tuples. - * @return {string} Source text. - */ -diff_match_patch.prototype.diff_text1 = function (diffs) { - var text = []; - for (var x = 0; x < diffs.length; x++) { - if (diffs[x][0] !== DIFF_INSERT) { - text[x] = diffs[x][1]; - } - } - return text.join(""); -}; - -/** - * Compute and return the destination text (all equalities and insertions). - * @param {!Array.} diffs Array of diff tuples. - * @return {string} Destination text. - */ -diff_match_patch.prototype.diff_text2 = function (diffs) { - var text = []; - for (var x = 0; x < diffs.length; x++) { - if (diffs[x][0] !== DIFF_DELETE) { - text[x] = diffs[x][1]; - } - } - return text.join(""); -}; - -/** - * Compute the Levenshtein distance; the number of inserted, deleted or - * substituted characters. - * @param {!Array.} diffs Array of diff tuples. - * @return {number} Number of changes. - */ -diff_match_patch.prototype.diff_levenshtein = function (diffs) { - var levenshtein = 0; - var insertions = 0; - var deletions = 0; - for (var x = 0; x < diffs.length; x++) { - var op = diffs[x][0]; - var data = diffs[x][1]; - switch (op) { - case DIFF_INSERT: - insertions += data.length; - break; - case DIFF_DELETE: - deletions += data.length; - break; - case DIFF_EQUAL: - // A deletion and an insertion is one substitution. - levenshtein += Math.max(insertions, deletions); - insertions = 0; - deletions = 0; - break; - } - } - levenshtein += Math.max(insertions, deletions); - return levenshtein; -}; - -/** - * Crush the diff into an encoded string which describes the operations - * required to transform text1 into text2. - * E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. - * Operations are tab-separated. Inserted text is escaped using %xx notation. - * @param {!Array.} diffs Array of diff tuples. - * @return {string} Delta text. - */ -diff_match_patch.prototype.diff_toDelta = function (diffs) { - var text = []; - for (var x = 0; x < diffs.length; x++) { - switch (diffs[x][0]) { - case DIFF_INSERT: - text[x] = "+" + encodeURI(diffs[x][1]); - break; - case DIFF_DELETE: - text[x] = "-" + diffs[x][1].length; - break; - case DIFF_EQUAL: - text[x] = "=" + diffs[x][1].length; - break; - } - } - return text.join("\t").replace(/%20/g, " "); -}; - -/** - * Given the original text1, and an encoded string which describes the - * operations required to transform text1 into text2, compute the full diff. - * @param {string} text1 Source string for the diff. - * @param {string} delta Delta text. - * @return {!Array.} Array of diff tuples. - * @throws {!Error} If invalid input. - */ -diff_match_patch.prototype.diff_fromDelta = function (text1, delta) { - var diffs = []; - var diffsLength = 0; // Keeping our own length var is faster in JS. - var pointer = 0; // Cursor in text1 - var tokens = delta.split(/\t/g); - for (var x = 0; x < tokens.length; x++) { - // Each token begins with a one character parameter which specifies the - // operation of this token (delete, insert, equality). - var param = tokens[x].substring(1); - switch (tokens[x].charAt(0)) { - case "+": - try { - diffs[diffsLength++] = new diff_match_patch.Diff( - DIFF_INSERT, - decodeURI(param) - ); - } catch (ex) { - // Malformed URI sequence. - throw new Error("Illegal escape in diff_fromDelta: " + param); - } - break; - case "-": - // Fall through. - case "=": - var n = parseInt(param, 10); - if (isNaN(n) || n < 0) { - throw new Error("Invalid number in diff_fromDelta: " + param); - } - var text = text1.substring(pointer, (pointer += n)); - if (tokens[x].charAt(0) == "=") { - diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text); - } else { - diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text); - } - break; - default: - // Blank tokens are ok (from a trailing \t). - // Anything else is an error. - if (tokens[x]) { - throw new Error( - "Invalid diff operation in diff_fromDelta: " + tokens[x] - ); - } - } - } - if (pointer != text1.length) { - throw new Error( - "Delta length (" + - pointer + - ") does not equal source text length (" + - text1.length + - ")." - ); - } - return diffs; -}; - -// MATCH FUNCTIONS - -/** - * Locate the best instance of 'pattern' in 'text' near 'loc'. - * @param {string} text The text to search. - * @param {string} pattern The pattern to search for. - * @param {number} loc The location to search around. - * @return {number} Best match index or -1. - */ -diff_match_patch.prototype.match_main = function (text, pattern, loc) { - // Check for null inputs. - if (text == null || pattern == null || loc == null) { - throw new Error("Null input. (match_main)"); - } - - loc = Math.max(0, Math.min(loc, text.length)); - if (text == pattern) { - // Shortcut (potentially not guaranteed by the algorithm) - return 0; - } else if (!text.length) { - // Nothing to match. - return -1; - } else if (text.substring(loc, loc + pattern.length) == pattern) { - // Perfect match at the perfect spot! (Includes case of null pattern) - return loc; - } else { - // Do a fuzzy compare. - return this.match_bitap_(text, pattern, loc); - } -}; - -/** - * Locate the best instance of 'pattern' in 'text' near 'loc' using the - * Bitap algorithm. - * @param {string} text The text to search. - * @param {string} pattern The pattern to search for. - * @param {number} loc The location to search around. - * @return {number} Best match index or -1. - * @private - */ -diff_match_patch.prototype.match_bitap_ = function (text, pattern, loc) { - if (pattern.length > this.Match_MaxBits) { - throw new Error("Pattern too long for this browser."); - } - - // Initialise the alphabet. - var s = this.match_alphabet_(pattern); - - var dmp = this; // 'this' becomes 'window' in a closure. - - /** - * Compute and return the score for a match with e errors and x location. - * Accesses loc and pattern through being a closure. - * @param {number} e Number of errors in match. - * @param {number} x Location of match. - * @return {number} Overall score for match (0.0 = good, 1.0 = bad). - * @private - */ - function match_bitapScore_(e, x) { - var accuracy = e / pattern.length; - var proximity = Math.abs(loc - x); - if (!dmp.Match_Distance) { - // Dodge divide by zero error. - return proximity ? 1.0 : accuracy; - } - return accuracy + proximity / dmp.Match_Distance; - } - - // Highest score beyond which we give up. - var score_threshold = this.Match_Threshold; - // Is there a nearby exact match? (speedup) - var best_loc = text.indexOf(pattern, loc); - if (best_loc != -1) { - score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold); - // What about in the other direction? (speedup) - best_loc = text.lastIndexOf(pattern, loc + pattern.length); - if (best_loc != -1) { - score_threshold = Math.min( - match_bitapScore_(0, best_loc), - score_threshold - ); - } - } - - // Initialise the bit arrays. - var matchmask = 1 << (pattern.length - 1); - best_loc = -1; - - var bin_min, bin_mid; - var bin_max = pattern.length + text.length; - var last_rd; - for (var d = 0; d < pattern.length; d++) { - // Scan for the best match; each iteration allows for one more error. - // Run a binary search to determine how far from 'loc' we can stray at this - // error level. - bin_min = 0; - bin_mid = bin_max; - while (bin_min < bin_mid) { - if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) { - bin_min = bin_mid; - } else { - bin_max = bin_mid; - } - bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min); - } - // Use the result from this iteration as the maximum for the next. - bin_max = bin_mid; - var start = Math.max(1, loc - bin_mid + 1); - var finish = Math.min(loc + bin_mid, text.length) + pattern.length; - - var rd = Array(finish + 2); - rd[finish + 1] = (1 << d) - 1; - for (var j = finish; j >= start; j--) { - // The alphabet (s) is a sparse hash, so the following line generates - // warnings. - var charMatch = s[text.charAt(j - 1)]; - if (d === 0) { - // First pass: exact match. - rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; - } else { - // Subsequent passes: fuzzy match. - rd[j] = - (((rd[j + 1] << 1) | 1) & charMatch) | - (((last_rd[j + 1] | last_rd[j]) << 1) | 1) | - last_rd[j + 1]; - } - if (rd[j] & matchmask) { - var score = match_bitapScore_(d, j - 1); - // This match will almost certainly be better than any existing match. - // But check anyway. - if (score <= score_threshold) { - // Told you so. - score_threshold = score; - best_loc = j - 1; - if (best_loc > loc) { - // When passing loc, don't exceed our current distance from loc. - start = Math.max(1, 2 * loc - best_loc); - } else { - // Already passed loc, downhill from here on in. - break; - } - } - } - } - // No hope for a (better) match at greater error levels. - if (match_bitapScore_(d + 1, loc) > score_threshold) { - break; - } - last_rd = rd; - } - return best_loc; -}; - -/** - * Initialise the alphabet for the Bitap algorithm. - * @param {string} pattern The text to encode. - * @return {!Object} Hash of character locations. - * @private - */ -diff_match_patch.prototype.match_alphabet_ = function (pattern) { - var s = {}; - for (var i = 0; i < pattern.length; i++) { - s[pattern.charAt(i)] = 0; - } - for (var i = 0; i < pattern.length; i++) { - s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1); - } - return s; -}; - -// PATCH FUNCTIONS - -/** - * Increase the context until it is unique, - * but don't let the pattern expand beyond Match_MaxBits. - * @param {!diff_match_patch.patch_obj} patch The patch to grow. - * @param {string} text Source text. - * @private - */ -diff_match_patch.prototype.patch_addContext_ = function (patch, text) { - if (text.length == 0) { - return; - } - if (patch.start2 === null) { - throw Error("patch not initialized"); - } - var pattern = text.substring(patch.start2, patch.start2 + patch.length1); - var padding = 0; - - // Look for the first and last matches of pattern in text. If two different - // matches are found, increase the pattern length. - while ( - text.indexOf(pattern) != text.lastIndexOf(pattern) && - pattern.length < this.Match_MaxBits - this.Patch_Margin - this.Patch_Margin - ) { - padding += this.Patch_Margin; - pattern = text.substring( - patch.start2 - padding, - patch.start2 + patch.length1 + padding - ); - } - // Add one chunk for good luck. - padding += this.Patch_Margin; - - // Add the prefix. - var prefix = text.substring(patch.start2 - padding, patch.start2); - if (prefix) { - patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix)); - } - // Add the suffix. - var suffix = text.substring( - patch.start2 + patch.length1, - patch.start2 + patch.length1 + padding - ); - if (suffix) { - patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix)); - } - - // Roll back the start points. - patch.start1 -= prefix.length; - patch.start2 -= prefix.length; - // Extend the lengths. - patch.length1 += prefix.length + suffix.length; - patch.length2 += prefix.length + suffix.length; -}; - -/** - * Compute a list of patches to turn text1 into text2. - * Use diffs if provided, otherwise compute it ourselves. - * There are four ways to call this function, depending on what data is - * available to the caller: - * Method 1: - * a = text1, b = text2 - * Method 2: - * a = diffs - * Method 3 (optimal): - * a = text1, b = diffs - * Method 4 (deprecated, use method 3): - * a = text1, b = text2, c = diffs - * - * @param {string|!Array.} a text1 (methods 1,3,4) or - * Array of diff tuples for text1 to text2 (method 2). - * @param {string|!Array.=} opt_b text2 (methods 1,4) or - * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2). - * @param {string|!Array.=} opt_c Array of diff tuples - * for text1 to text2 (method 4) or undefined (methods 1,2,3). - * @return {!Array.} Array of Patch objects. - */ -diff_match_patch.prototype.patch_make = function (a, opt_b, opt_c) { - var text1, diffs; - if ( - typeof a == "string" && - typeof opt_b == "string" && - typeof opt_c == "undefined" - ) { - // Method 1: text1, text2 - // Compute diffs from text1 and text2. - text1 = /** @type {string} */ (a); - diffs = this.diff_main(text1, /** @type {string} */ (opt_b), true); - if (diffs.length > 2) { - this.diff_cleanupSemantic(diffs); - this.diff_cleanupEfficiency(diffs); - } - } else if ( - a && - typeof a == "object" && - typeof opt_b == "undefined" && - typeof opt_c == "undefined" - ) { - // Method 2: diffs - // Compute text1 from diffs. - diffs = /** @type {!Array.} */ (a); - text1 = this.diff_text1(diffs); - } else if ( - typeof a == "string" && - opt_b && - typeof opt_b == "object" && - typeof opt_c == "undefined" - ) { - // Method 3: text1, diffs - text1 = /** @type {string} */ (a); - diffs = /** @type {!Array.} */ (opt_b); - } else if ( - typeof a == "string" && - typeof opt_b == "string" && - opt_c && - typeof opt_c == "object" - ) { - // Method 4: text1, text2, diffs - // text2 is not used. - text1 = /** @type {string} */ (a); - diffs = /** @type {!Array.} */ (opt_c); - } else { - throw new Error("Unknown call format to patch_make."); - } - - if (diffs.length === 0) { - return []; // Get rid of the null case. - } - var patches = []; - var patch = new diff_match_patch.patch_obj(); - var patchDiffLength = 0; // Keeping our own length var is faster in JS. - var char_count1 = 0; // Number of characters into the text1 string. - var char_count2 = 0; // Number of characters into the text2 string. - // Start with text1 (prepatch_text) and apply the diffs until we arrive at - // text2 (postpatch_text). We recreate the patches one by one to determine - // context info. - var prepatch_text = text1; - var postpatch_text = text1; - for (var x = 0; x < diffs.length; x++) { - var diff_type = diffs[x][0]; - var diff_text = diffs[x][1]; - - if (!patchDiffLength && diff_type !== DIFF_EQUAL) { - // A new patch starts here. - patch.start1 = char_count1; - patch.start2 = char_count2; - } - - switch (diff_type) { - case DIFF_INSERT: - patch.diffs[patchDiffLength++] = diffs[x]; - patch.length2 += diff_text.length; - postpatch_text = - postpatch_text.substring(0, char_count2) + - diff_text + - postpatch_text.substring(char_count2); - break; - case DIFF_DELETE: - patch.length1 += diff_text.length; - patch.diffs[patchDiffLength++] = diffs[x]; - postpatch_text = - postpatch_text.substring(0, char_count2) + - postpatch_text.substring(char_count2 + diff_text.length); - break; - case DIFF_EQUAL: - if ( - diff_text.length <= 2 * this.Patch_Margin && - patchDiffLength && - diffs.length != x + 1 - ) { - // Small equality inside a patch. - patch.diffs[patchDiffLength++] = diffs[x]; - patch.length1 += diff_text.length; - patch.length2 += diff_text.length; - } else if (diff_text.length >= 2 * this.Patch_Margin) { - // Time for a new patch. - if (patchDiffLength) { - this.patch_addContext_(patch, prepatch_text); - patches.push(patch); - patch = new diff_match_patch.patch_obj(); - patchDiffLength = 0; - // Unlike Unidiff, our patch lists have a rolling context. - // https://github.com/google/diff-match-patch/wiki/Unidiff - // Update prepatch text & pos to reflect the application of the - // just completed patch. - prepatch_text = postpatch_text; - char_count1 = char_count2; - } - } - break; - } - - // Update the current character count. - if (diff_type !== DIFF_INSERT) { - char_count1 += diff_text.length; - } - if (diff_type !== DIFF_DELETE) { - char_count2 += diff_text.length; - } - } - // Pick up the leftover patch if not empty. - if (patchDiffLength) { - this.patch_addContext_(patch, prepatch_text); - patches.push(patch); - } - - return patches; -}; - -/** - * Given an array of patches, return another array that is identical. - * @param {!Array.} patches Array of Patch objects. - * @return {!Array.} Array of Patch objects. - */ -diff_match_patch.prototype.patch_deepCopy = function (patches) { - // Making deep copies is hard in JavaScript. - var patchesCopy = []; - for (var x = 0; x < patches.length; x++) { - var patch = patches[x]; - var patchCopy = new diff_match_patch.patch_obj(); - patchCopy.diffs = []; - for (var y = 0; y < patch.diffs.length; y++) { - patchCopy.diffs[y] = new diff_match_patch.Diff( - patch.diffs[y][0], - patch.diffs[y][1] - ); - } - patchCopy.start1 = patch.start1; - patchCopy.start2 = patch.start2; - patchCopy.length1 = patch.length1; - patchCopy.length2 = patch.length2; - patchesCopy[x] = patchCopy; - } - return patchesCopy; -}; - -/** - * Merge a set of patches onto the text. Return a patched text, as well - * as a list of true/false values indicating which patches were applied. - * @param {!Array.} patches Array of Patch objects. - * @param {string} text Old text. - * @return {!Array.>} Two element Array, containing the - * new text and an array of boolean values. - */ -diff_match_patch.prototype.patch_apply = function (patches, text) { - if (patches.length == 0) { - return [text, []]; - } - - // Deep copy the patches so that no changes are made to originals. - patches = this.patch_deepCopy(patches); - - var nullPadding = this.patch_addPadding(patches); - text = nullPadding + text + nullPadding; - - this.patch_splitMax(patches); - // delta keeps track of the offset between the expected and actual location - // of the previous patch. If there are patches expected at positions 10 and - // 20, but the first patch was found at 12, delta is 2 and the second patch - // has an effective expected position of 22. - var delta = 0; - var results = []; - for (var x = 0; x < patches.length; x++) { - var expected_loc = patches[x].start2 + delta; - var text1 = this.diff_text1(patches[x].diffs); - var start_loc; - var end_loc = -1; - if (text1.length > this.Match_MaxBits) { - // patch_splitMax will only provide an oversized pattern in the case of - // a monster delete. - start_loc = this.match_main( - text, - text1.substring(0, this.Match_MaxBits), - expected_loc - ); - if (start_loc != -1) { - end_loc = this.match_main( - text, - text1.substring(text1.length - this.Match_MaxBits), - expected_loc + text1.length - this.Match_MaxBits - ); - if (end_loc == -1 || start_loc >= end_loc) { - // Can't find valid trailing context. Drop this patch. - start_loc = -1; - } - } - } else { - start_loc = this.match_main(text, text1, expected_loc); - } - if (start_loc == -1) { - // No match found. :( - results[x] = false; - // Subtract the delta for this failed patch from subsequent patches. - delta -= patches[x].length2 - patches[x].length1; - } else { - // Found a match. :) - results[x] = true; - delta = start_loc - expected_loc; - var text2; - if (end_loc == -1) { - text2 = text.substring(start_loc, start_loc + text1.length); - } else { - text2 = text.substring(start_loc, end_loc + this.Match_MaxBits); - } - if (text1 == text2) { - // Perfect match, just shove the replacement text in. - text = - text.substring(0, start_loc) + - this.diff_text2(patches[x].diffs) + - text.substring(start_loc + text1.length); - } else { - // Imperfect match. Run a diff to get a framework of equivalent - // indices. - var diffs = this.diff_main(text1, text2, false); - if ( - text1.length > this.Match_MaxBits && - this.diff_levenshtein(diffs) / text1.length > - this.Patch_DeleteThreshold - ) { - // The end points match, but the content is unacceptably bad. - results[x] = false; - } else { - this.diff_cleanupSemanticLossless(diffs); - var index1 = 0; - var index2; - for (var y = 0; y < patches[x].diffs.length; y++) { - var mod = patches[x].diffs[y]; - if (mod[0] !== DIFF_EQUAL) { - index2 = this.diff_xIndex(diffs, index1); - } - if (mod[0] === DIFF_INSERT) { - // Insertion - text = - text.substring(0, start_loc + index2) + - mod[1] + - text.substring(start_loc + index2); - } else if (mod[0] === DIFF_DELETE) { - // Deletion - text = - text.substring(0, start_loc + index2) + - text.substring( - start_loc + this.diff_xIndex(diffs, index1 + mod[1].length) - ); - } - if (mod[0] !== DIFF_DELETE) { - index1 += mod[1].length; - } - } - } - } - } - } - // Strip the padding off. - text = text.substring(nullPadding.length, text.length - nullPadding.length); - return [text, results]; -}; - -/** - * Add some padding on text start and end so that edges can match something. - * Intended to be called only from within patch_apply. - * @param {!Array.} patches Array of Patch objects. - * @return {string} The padding string added to each side. - */ -diff_match_patch.prototype.patch_addPadding = function (patches) { - var paddingLength = this.Patch_Margin; - var nullPadding = ""; - for (var x = 1; x <= paddingLength; x++) { - nullPadding += String.fromCharCode(x); - } - - // Bump all the patches forward. - for (var x = 0; x < patches.length; x++) { - patches[x].start1 += paddingLength; - patches[x].start2 += paddingLength; - } - - // Add some padding on start of first diff. - var patch = patches[0]; - var diffs = patch.diffs; - if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) { - // Add nullPadding equality. - diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding)); - patch.start1 -= paddingLength; // Should be 0. - patch.start2 -= paddingLength; // Should be 0. - patch.length1 += paddingLength; - patch.length2 += paddingLength; - } else if (paddingLength > diffs[0][1].length) { - // Grow first equality. - var extraLength = paddingLength - diffs[0][1].length; - diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1]; - patch.start1 -= extraLength; - patch.start2 -= extraLength; - patch.length1 += extraLength; - patch.length2 += extraLength; - } - - // Add some padding on end of last diff. - patch = patches[patches.length - 1]; - diffs = patch.diffs; - if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) { - // Add nullPadding equality. - diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding)); - patch.length1 += paddingLength; - patch.length2 += paddingLength; - } else if (paddingLength > diffs[diffs.length - 1][1].length) { - // Grow last equality. - var extraLength = paddingLength - diffs[diffs.length - 1][1].length; - diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength); - patch.length1 += extraLength; - patch.length2 += extraLength; - } - - return nullPadding; -}; - -/** - * Look through the patches and break up any which are longer than the maximum - * limit of the match algorithm. - * Intended to be called only from within patch_apply. - * @param {!Array.} patches Array of Patch objects. - */ -diff_match_patch.prototype.patch_splitMax = function (patches) { - var patch_size = this.Match_MaxBits; - for (var x = 0; x < patches.length; x++) { - if (patches[x].length1 <= patch_size) { - continue; - } - var bigpatch = patches[x]; - // Remove the big old patch. - patches.splice(x--, 1); - var start1 = bigpatch.start1; - var start2 = bigpatch.start2; - var precontext = ""; - while (bigpatch.diffs.length !== 0) { - // Create one of several smaller patches. - var patch = new diff_match_patch.patch_obj(); - var empty = true; - patch.start1 = start1 - precontext.length; - patch.start2 = start2 - precontext.length; - if (precontext !== "") { - patch.length1 = patch.length2 = precontext.length; - patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext)); - } - while ( - bigpatch.diffs.length !== 0 && - patch.length1 < patch_size - this.Patch_Margin - ) { - var diff_type = bigpatch.diffs[0][0]; - var diff_text = bigpatch.diffs[0][1]; - if (diff_type === DIFF_INSERT) { - // Insertions are harmless. - patch.length2 += diff_text.length; - start2 += diff_text.length; - patch.diffs.push(bigpatch.diffs.shift()); - empty = false; - } else if ( - diff_type === DIFF_DELETE && - patch.diffs.length == 1 && - patch.diffs[0][0] == DIFF_EQUAL && - diff_text.length > 2 * patch_size - ) { - // This is a large deletion. Let it pass in one chunk. - patch.length1 += diff_text.length; - start1 += diff_text.length; - empty = false; - patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text)); - bigpatch.diffs.shift(); - } else { - // Deletion or equality. Only take as much as we can stomach. - diff_text = diff_text.substring( - 0, - patch_size - patch.length1 - this.Patch_Margin - ); - patch.length1 += diff_text.length; - start1 += diff_text.length; - if (diff_type === DIFF_EQUAL) { - patch.length2 += diff_text.length; - start2 += diff_text.length; - } else { - empty = false; - } - patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text)); - if (diff_text == bigpatch.diffs[0][1]) { - bigpatch.diffs.shift(); - } else { - bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring( - diff_text.length - ); - } - } - } - // Compute the head context for the next patch. - precontext = this.diff_text2(patch.diffs); - precontext = precontext.substring(precontext.length - this.Patch_Margin); - // Append the end context for this patch. - var postcontext = this.diff_text1(bigpatch.diffs).substring( - 0, - this.Patch_Margin - ); - if (postcontext !== "") { - patch.length1 += postcontext.length; - patch.length2 += postcontext.length; - if ( - patch.diffs.length !== 0 && - patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL - ) { - patch.diffs[patch.diffs.length - 1][1] += postcontext; - } else { - patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext)); - } - } - if (!empty) { - patches.splice(++x, 0, patch); - } - } - } -}; - -/** - * Take a list of patches and return a textual representation. - * @param {!Array.} patches Array of Patch objects. - * @return {string} Text representation of patches. - */ -diff_match_patch.prototype.patch_toText = function (patches) { - var text = []; - for (var x = 0; x < patches.length; x++) { - text[x] = patches[x]; - } - return text.join(""); -}; - -/** - * Parse a textual representation of patches and return a list of Patch objects. - * @param {string} textline Text representation of patches. - * @return {!Array.} Array of Patch objects. - * @throws {!Error} If invalid input. - */ -diff_match_patch.prototype.patch_fromText = function (textline) { - var patches = []; - if (!textline) { - return patches; - } - var text = textline.split("\n"); - var textPointer = 0; - var patchHeader = /^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/; - while (textPointer < text.length) { - var m = text[textPointer].match(patchHeader); - if (!m) { - throw new Error("Invalid patch string: " + text[textPointer]); - } - var patch = new diff_match_patch.patch_obj(); - patches.push(patch); - patch.start1 = parseInt(m[1], 10); - if (m[2] === "") { - patch.start1--; - patch.length1 = 1; - } else if (m[2] == "0") { - patch.length1 = 0; - } else { - patch.start1--; - patch.length1 = parseInt(m[2], 10); - } - - patch.start2 = parseInt(m[3], 10); - if (m[4] === "") { - patch.start2--; - patch.length2 = 1; - } else if (m[4] == "0") { - patch.length2 = 0; - } else { - patch.start2--; - patch.length2 = parseInt(m[4], 10); - } - textPointer++; - - while (textPointer < text.length) { - var sign = text[textPointer].charAt(0); - try { - var line = decodeURI(text[textPointer].substring(1)); - } catch (ex) { - // Malformed URI sequence. - throw new Error("Illegal escape in patch_fromText: " + line); - } - if (sign == "-") { - // Deletion. - patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line)); - } else if (sign == "+") { - // Insertion. - patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line)); - } else if (sign == " ") { - // Minor equality. - patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line)); - } else if (sign == "@") { - // Start of next patch. - break; - } else if (sign === "") { - // Blank line? Whatever. - } else { - // WTF? - throw new Error('Invalid patch mode "' + sign + '" in: ' + line); - } - textPointer++; - } - } - return patches; -}; - -/** - * Class representing one patch operation. - * @constructor - */ -diff_match_patch.patch_obj = function () { - /** @type {!Array.} */ - this.diffs = []; - /** @type {?number} */ - this.start1 = null; - /** @type {?number} */ - this.start2 = null; - /** @type {number} */ - this.length1 = 0; - /** @type {number} */ - this.length2 = 0; -}; - -/** - * Emulate GNU diff's format. - * Header: @@ -382,8 +481,9 @@ - * Indices are printed as 1-based, not 0-based. - * @return {string} The GNU diff string. - */ -diff_match_patch.patch_obj.prototype.toString = function () { - var coords1, coords2; - if (this.length1 === 0) { - coords1 = this.start1 + ",0"; - } else if (this.length1 == 1) { - coords1 = this.start1 + 1; - } else { - coords1 = this.start1 + 1 + "," + this.length1; - } - if (this.length2 === 0) { - coords2 = this.start2 + ",0"; - } else if (this.length2 == 1) { - coords2 = this.start2 + 1; - } else { - coords2 = this.start2 + 1 + "," + this.length2; - } - var text = ["@@ -" + coords1 + " +" + coords2 + " @@\n"]; - var op; - // Escape the body of the patch with %xx notation. - for (var x = 0; x < this.diffs.length; x++) { - switch (this.diffs[x][0]) { - case DIFF_INSERT: - op = "+"; - break; - case DIFF_DELETE: - op = "-"; - break; - case DIFF_EQUAL: - op = " "; - break; - } - text[x + 1] = op + encodeURI(this.diffs[x][1]) + "\n"; - } - return text.join("").replace(/%20/g, " "); -}; - -export default diff_match_patch; diff --git a/packages/editor/src/runtime/editor/prettier/index.ts b/packages/editor/src/runtime/editor/prettier/index.ts deleted file mode 100644 index b85bebf56..000000000 --- a/packages/editor/src/runtime/editor/prettier/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -import parserTypescript from "prettier/parser-typescript"; -import parserCSS from "prettier/parser-postcss"; -import prettier from "prettier/standalone"; -import { diffToMonacoTextEdits } from "./diffToMonacoTextEdits"; -import type * as monaco from "monaco-editor"; - -export function setupPrettier(monacoInstance: typeof monaco) { - monacoInstance.languages.registerDocumentFormattingEditProvider( - "typescript", - { - provideDocumentFormattingEdits(model, options, token) { - try { - const newText = prettier.format(model.getValue(), { - parser: "typescript", - plugins: [parserTypescript], - tabWidth: 2, - printWidth: 80, - jsxBracketSameLine: true, - }); - - let ret = diffToMonacoTextEdits(model, newText); - return ret; - } catch (e) { - console.warn("error while formatting ts code (prettier)", e); - return []; - } - }, - } - ); - - monacoInstance.languages.registerDocumentFormattingEditProvider("css", { - provideDocumentFormattingEdits(model, options, token) { - try { - const newText = prettier.format(model.getValue(), { - parser: "css", - plugins: [parserCSS], - tabWidth: 2, - printWidth: 80, - }); - - let ret = diffToMonacoTextEdits(model, newText); - return ret; - } catch (e) { - console.warn("error while formatting css code (prettier)", e); - return []; - } - }, - }); -} diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/FreezeAlert.tsx b/packages/editor/src/runtime/executor/executionHosts/sandboxed/FreezeAlert.tsx deleted file mode 100644 index 561dab8a7..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/FreezeAlert.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import * as React from "react"; -import Flag from "@atlaskit/flag"; -import { VscWarning } from "react-icons/vsc"; - -/** - * A popup that is shown when we haven't received a "pong" message for a while. - * There might be an infinite loop or other error in the user code. - */ -export const FreezeAlert = (props: { - // onDismiss: () => void; - onReload: () => void; -}) => { - return ( - - } - id="error" - key="error" - title="The document is not responding" - description="It seems like your document has frozen. Perhaps there is an infinite loop in the code? - Fix any code errors and click Reload to retry." - actions={[ - // { content: "Dismiss", onClick: props.onDismiss }, - { content: "Reload", onClick: props.onReload }, - ]} - /> - ); -}; diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/OutputShadow.tsx b/packages/editor/src/runtime/executor/executionHosts/sandboxed/OutputShadow.tsx deleted file mode 100644 index 913e2cfa7..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/OutputShadow.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { runInAction } from "mobx"; -import { observer } from "mobx-react-lite"; -import { useEffect, useRef } from "react"; - -/** - * The OutputShadow is a "fake" empty div which the SandboxedExecutionHost renders - * in the position of the cell output. - * However, the actual cell output is rendered by the Iframe (iframe/Frame.tsx). - * - * The dimensions of the OutputShadow are passed in from the iframe (via the bridge), - * so the iframe knows where to render the actual output. - * - * The position of the OutputShadow are passed to the iframe over the bridge (by the host). - */ -export const OutputShadow = observer( - (props: { - dimensions: { width: number; height: number }; - positions: { x: number; y: number }; - positionOffsetElement: HTMLElement; - onMouseMove: () => void; - }) => { - const divRef = useRef(null); - - // Monitor the position of the OutputShadow so we can pass - // updates to the iframe. The iframe then knows at which x, y position - // it needs to render the output - useEffect(() => { - const updatePositions = () => { - if (!divRef.current) { - return; - } - const parentBB = props.positionOffsetElement.getBoundingClientRect(); - let { y, x } = divRef.current.getBoundingClientRect(); - y -= parentBB.y; - x -= parentBB.x; - runInAction(() => { - if (props.positions.x !== x || props.positions.y !== y) { - // console.log("update pos", y, props.positions.y); - props.positions.x = x; - props.positions.y = y; - } - }); - }; - // We use setInterval to monitor the positions. - // TODO: can we use MutationObserver or something else for this? - const handle = setInterval(updatePositions, 20); - return () => { - clearInterval(handle); - }; - }, [props.positions, props.positionOffsetElement]); - - return ( -
- ); - } -); - -export default OutputShadow; diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/README.md b/packages/editor/src/runtime/executor/executionHosts/sandboxed/README.md deleted file mode 100644 index 15c1b05b2..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Iframe sandbox architecture - -The actual end-user code that users can enter in TypeCell code cells, gets executed in an iframe that runs on a different domain. - -## Why? - -End-user code should not be able to access the TypeCell application javascript. Otherwise, it could delete / create / modify Notebooks by the user without the user's permission. Or for example, steal authentication cookies and send them to a third party using `fetch`. - -## Architecture - -`NotebookRenderer` calls `SandboxedExecutionHost.renderContainer()`. This creates an Iframe where the end-user code is evaluated and the outputs are rendered. - -`NotebookRenderer` calls `SandboxedExecutionHost.renderOutput()` whereever the output of cells should be rendered. `SandboxedExecutionHost` renders a so-called `OutputShadow` div in the location. This div is used for two reasons: - -- We keep track of it's location (x,y position), so that in the Iframe, we know at which location we need to render the cell output -- We update its dimensions with the actual dimensions of the output. This is done so that the rest of the document flows accordingly (i.e.: other cells / content below the cell are moved down when the output gets larger). - -## Bridge - -We use PostMessage communication to communicate between the Host and the Iframe. This is done using the [Penpal](https://github.com/Aaronius/penpal) library. - -The interfaces are: - -- [IframeBridgeMethods](./iframesandbox/IframeBridgeMethods.ts): methods the host can call on the iframe -- [HostBridgeMethods](./HostBridgeMethods.ts): methods the iframe can call on the host - -The main data that's being communicated across the bridge: - -- The host sends javascript code of the code cells (code models) to the iframe -- The host sends the position of code cell outputs (OutputShadow (x, y) positions) to the iframe -- The iframe sends dimensions of rendered output to the host (so that it can change the dimensions of OutputShadow) -- When the user mouse-outs an Output, the iframe sends a mouseleave event to the host. The host then re-acquires mouse pointer events by setting pointerEvents:none on the iframe. - -## Files - -- [iframesandbox](./iframesandbox) directory contains the files that are used in the iframe - -## Modules - -An extra complexity is when client code imports a TypeCell module (e.g.: `import * as nb from "@user/notebook"`). The iframe signals this required module import to the Host, upon which the host starts watching and compiling the notebook. It then sends the compiled javascript code back to the iframe across the bridge. diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/SandboxedExecutionHost.tsx b/packages/editor/src/runtime/executor/executionHosts/sandboxed/SandboxedExecutionHost.tsx deleted file mode 100644 index 52c0f4355..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/SandboxedExecutionHost.tsx +++ /dev/null @@ -1,430 +0,0 @@ -import { FlagGroup } from "@atlaskit/flag"; -import { autorun, makeObservable, observable, runInAction } from "mobx"; -import { observer } from "mobx-react-lite"; -import type * as monaco from "monaco-editor"; -import { AsyncMethodReturns, Connection, connectToChild } from "penpal"; -import { lifecycle } from "vscode-lib"; -import { getFrameDomain } from "../../../../config/security"; -import { CompiledCodeModel } from "../../../../models/CompiledCodeModel"; -import { TypeCellCodeModel } from "../../../../models/TypeCellCodeModel"; -import { ContainedElement } from "../../../../util/ContainedElement"; -import SourceModelCompiler from "../../../compiler/SourceModelCompiler"; -import { VisualizerExtension } from "../../../extensions/visualizer/VisualizerExtension"; -import { TypeCellModuleCompiler } from "../../resolver/typecell/TypeCellModuleCompiler"; -import { ExecutionHost } from "../ExecutionHost"; -import { FreezeAlert } from "./FreezeAlert"; -import { HostBridgeMethods } from "./HostBridgeMethods"; -import { IframeBridgeMethods } from "./iframesandbox/IframeBridgeMethods"; -import { ModelForwarder } from "./ModelForwarder"; -import OutputShadow from "./OutputShadow"; - -let ENGINE_ID = 0; -const FREEZE_TIMEOUT = 3000; - -/** - * The SandboxedExecutionHost evaluates end-user code in an iframe on a different domain - * (see README.md) - */ -export default class SandboxedExecutionHost - extends lifecycle.Disposable - implements ExecutionHost -{ - public readonly id = ENGINE_ID++; - - public showFreezeAlert = observable.box(false); - - public readonly iframe: HTMLIFrameElement; - - private disposed: boolean = false; - - private resetHovering = () => {}; - - /** - * Penpal postmessage connection to the iframe - */ - private readonly connection: Connection; - - /** - * Penpal postmessage connection methods exposed by the iframe - */ - private connectionMethods: - | AsyncMethodReturns - | undefined; - - /** - * map of keeping track of the dimensions of all cells (passed in from the iframe) - */ - private readonly dimensionStore = new Map< - string, - { width: number; height: number } - >(); - - /** - * map of keeping track of the x,y positions of all cells, - * passed to the iframe when changed - */ - private readonly positionCacheStore = new Map< - string, - { x: number; y: number } - >(); - - /** - * moduleManager with key "main" is used to pass code models of the - * main notebook (with documentId) to the iframe - * - * moduleManagers with other keys are used to pass code models of TypeCell modules (!@username/notebook) - * to the iframe - */ - private moduleManagers = new Map< - string, - { - compiler: TypeCellModuleCompiler; - forwarder: ModelForwarder; - } - >(); - - constructor( - private readonly documentId: string, - private readonly compileEngine: SourceModelCompiler, - private monacoInstance: typeof monaco - ) { - super(); - - const iframe = document.createElement("iframe"); - iframe.style.position = "absolute"; - iframe.style.width = "100%"; - iframe.style.height = "100%"; - iframe.style.pointerEvents = "all"; - iframe.style.border = "none"; - iframe.className = "fullSize"; - iframe.sandbox.add( - "allow-same-origin", - "allow-scripts", - "allow-downloads", - "allow-popups", - "allow-modals", - "allow-forms", - "allow-popups-to-escape-sandbox", - "allow-top-navigation-by-user-activation" - ); - iframe.allow = - "geolocation; microphone; camera; midi; encrypted-media; autoplay; accelerometer; magnetometer; gyroscope"; - iframe.allowFullscreen = true; - iframe.src = - window.location.protocol + - "//" + - getFrameDomain() + - "/?frame" + - "&documentId=" + - encodeURIComponent(documentId) + - (window.location.search.includes("noRun") ? "&noRun" : ""); - - iframe.onmouseleave = () => { - // console.log("exit iframe"); - this.enableIframePointerEvents(); - this.resetHovering(); - }; - this.iframe = iframe; - this.connection = connectToChild({ - // The iframe to which a connection should be made - iframe: this.iframe, - // Methods the parent is exposing to the child - methods: this.methods, - }); - - this.initialize().then( - () => {}, - (e) => { - console.error(e); - } - ); - } - - /** - * Methods exposed to the iframe - */ - private methods: HostBridgeMethods = { - /** - * The iframe requests the compiled code of an imported TypeCell module (e.g.: !@username/notebook) - * We set up a compiler and modelforwarder to pass compiled code back to the iframe - */ - registerTypeCellModuleCompiler: async (moduleName: string) => { - if (this.moduleManagers.has(moduleName)) { - console.warn("already has moduleManager for", moduleName); - return; - } - const compiler = new TypeCellModuleCompiler( - moduleName, - this.monacoInstance - ); - const forwarder = new ModelForwarder( - "modules/" + moduleName, - compiler, - this.connectionMethods! - ); - this.moduleManagers.set(moduleName, { compiler, forwarder }); - await forwarder.initialize(); - }, - unregisterTypeCellModuleCompiler: async (moduleName: string) => { - const moduleManager = this.moduleManagers.get(moduleName); - if (!moduleManager) { - console.warn("no moduleManager for", moduleName); - return; - } - moduleManager.compiler.dispose(); - moduleManager.forwarder.dispose(); - this.moduleManagers.delete(moduleName); - }, - /** - * The mouse has left the Output of a cell in the iframe - */ - mouseLeave: async () => { - this.enableIframePointerEvents(); - }, - /** - * Update the dimensions of a cells output - */ - setDimensions: async ( - id: string, - dimensions: { width: number; height: number } - ) => { - const dimensionsToSet = this.dimensionStore.get(id); - if (!dimensionsToSet) { - console.warn("setDimensions called, but for invalid or removed model?"); - return; - } - runInAction(() => { - dimensionsToSet.width = dimensions.width; - dimensionsToSet.height = dimensions.height; - }); - }, - }; - - /** - * the iframe should capture mouse events - */ - private enableIframePointerEvents = () => { - ( - this.iframe.parentElement?.parentElement as HTMLDivElement - ).style.pointerEvents = "auto"; - }; - - /** - * The host should capture mouse events - * (disable pointer events on the iframe) - */ - private disableIframePointerEvents = () => { - ( - this.iframe.parentElement?.parentElement as HTMLDivElement - ).style.pointerEvents = "none"; - }; - - async initialize() { - console.log("initialize IFrameEngine"); - - this._register( - this.compileEngine.onDidCreateCompiledModel((m) => this.registerModel(m)) - ); - for (let model of this.compileEngine.compiledModels) { - this.registerModel(model); - } - - this.connectionMethods = await this.connection.promise; - console.log("IFrameEngine connection established"); - - const forwarder = this._register( - new ModelForwarder("main", this.compileEngine, this.connectionMethods) - ); - await forwarder.initialize(); - - for (let model of this.compileEngine.compiledModels) { - // send initial positions - console.log("initial positions", this.positionCacheStore.get(model.path)); - await this.sendModelPositions( - model, - this.positionCacheStore.get(model.path)! - ); - } - - // type visualizers (experimental) - const visualizerExtension = this._register( - new VisualizerExtension( - this.compileEngine, - this.documentId, - this.monacoInstance - ) - ); - - this._register( - visualizerExtension.onUpdateVisualizers((e) => { - this.connectionMethods!.updateVisualizers(e); - }) - ); - - this.setupPing(); - } - - /** - * Keep pinging the iframe, and show a "freeze" alert if we haven't received a pong in time - * (can happen in case of infinite loops in user code) - */ - private setupPing() { - const handle = setInterval(async () => { - try { - await Promise.race([ - this.pingFrame(), - new Promise((_, reject) => { - setTimeout(reject, FREEZE_TIMEOUT); - }), - ]); - runInAction(() => { - this.showFreezeAlert.set(false); - }); - } catch { - runInAction(() => { - this.showFreezeAlert.set(true); - }); - } - }, FREEZE_TIMEOUT); - this._register({ - dispose: () => clearInterval(handle), - }); - } - - private async pingFrame() { - const result = await this.connectionMethods!.ping(); - // console.log("received ping result", result); - if (result !== "pong") { - throw new Error("invalid ping response"); - } - } - - /** - * Pass the updated positions where a Cell's output should be shown to the iframe - */ - private async sendModelPositions( - model: CompiledCodeModel, - positions: { x: number; y: number } - ) { - // console.log("send update positions", model.path, positions); - await this.connectionMethods!.updatePositions(model.path, positions); - } - - /** - * Register a model to the engine. After registering, the model will be observed for changes and automatically re-evaluated. - * - * When the model is disposed (model.dispose()), the model is automatically unregistered. - * @param model model to register - */ - private registerModel(model: CompiledCodeModel) { - if (this.disposed) { - throw new Error("registering model on disposed engine"); - } - // if (this.registeredModels.has(model)) { - // console.warn("model already registered"); // TODO: shouldn't happen - // return; - // } - const positionCache = { x: 0, y: 0 }; - this.dimensionStore.set( - model.path, - makeObservable( - { width: 0, height: 0 }, - { width: observable.ref, height: observable.ref } - ) - ); - this.positionCacheStore.set( - model.path, - makeObservable(positionCache, { x: observable.ref, y: observable.ref }) - ); - - let dispose = autorun(() => { - const positions = { x: positionCache.x, y: positionCache.y }; - if (this.connectionMethods) { - // console.log( - // "update positions", - // this.positionCacheStore.get(model.path) - // ); - this.sendModelPositions(model, positions); - } else { - console.log("delay sending positions, connection not established"); - } - }); - - this._register( - model.onWillDispose(() => { - this.positionCacheStore.delete(model.path); - this.dimensionStore.delete(model.path); - // this.registeredModels.delete(model); - dispose(); - }) - ); - } - - private FlagComponent = observer((props: {}) => { - if (!this.showFreezeAlert.get()) { - return null; - } - const reload = () => { - // eslint-disable-next-line no-self-assign - window.location.href = window.location.href; - }; - return ( - - - - ); - }); - - /** - * Renders the iframe and "freeze flag". Called by NotebookRenderer - */ - public renderContainer() { - const FlagComponent = this.FlagComponent; - return ( - <> - - - - ); - } - - /** - * Render the output of a specific model (cell). - * We render an OutputShadow to keep track of positions, - * but the actual output is rendered in the iframe - */ - public renderOutput( - model: TypeCellCodeModel, - setHovering: (hover: boolean) => void - ) { - return ( - { - this.disableIframePointerEvents(); - this.resetHovering = () => setHovering(false); - setHovering(true); - }} - /> - ); - } - - public dispose() { - if (this.disposed) { - throw new Error("EngineWithOutput already disposed"); - } - this.disposed = true; - - this.moduleManagers.forEach((m) => { - m.forwarder.dispose(); - m.compiler.dispose(); - }); - - this.moduleManagers.clear(); - - super.dispose(); - } -} diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.css b/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.css deleted file mode 100644 index 1e59cba45..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.css +++ /dev/null @@ -1,4 +0,0 @@ -html, -body { - overflow: hidden; -} diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.tsx b/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.tsx deleted file mode 100644 index e525f6f08..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/Frame.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { observer } from "mobx-react-lite"; -import { useCallback, useEffect, useRef } from "react"; -import Output from "../../../components/Output"; -import { FrameConnection } from "./FrameConnection"; -import "./Frame.css"; - -// The sandbox frame where end-user code gets evaluated. -// It is loaded from index.iframe.ts - -// global connection to parent window -let frameConnection: FrameConnection | undefined; - -function getFrameConnection() { - if (!frameConnection) { - frameConnection = new FrameConnection(); - } - return frameConnection; -} - -/* - Test scenarios: - - Cell works well with overflow: export let x =
hello
; - - Outer cell div must be exactly same as OutputShadow div, so hovering over output vs code must change pointerEvents correctly (see IframeEngine) - */ - -export const Frame = observer((props: {}) => { - const connection = getFrameConnection(); - - /** - * The resizeObserver keeps track of the dimensions of all cell Output divs. - * The dimensions are forwarded to the host, so it can use it the resize the "fake" OutputShadow - * divs accordingly - */ - const resizeObserver = useRef( - new ResizeObserver((entries) => { - for (let entry of entries) { - const path = entry.target.getAttribute("data-path"); - if (!path) { - throw new Error("unexpected"); - } - if (entry.borderBoxSize) { - const borderBoxSize = Array.isArray(entry.borderBoxSize) - ? entry.borderBoxSize[0] - : entry.borderBoxSize; - - connection.setDimensions(path, { - width: borderBoxSize.inlineSize, - height: borderBoxSize.blockSize, - }); - } else { - connection.setDimensions(path, { - width: entry.contentRect.left + entry.contentRect.right, - height: entry.contentRect.top + entry.contentRect.bottom, - }); - } - } - }) - ); - - function setRef(div: HTMLDivElement | null) { - if (!div) { - return; - } - resizeObserver.current.observe(div); - // TODO: currently we never unobserve - } - - // This is triggered when the mouse moves over the iframe, but not over an output area (because we use stopPropagation below). - // Trigger mouseLeave and hand over capture area to the parent window. - const onMouseLeaveContainer = useCallback(() => { - connection.mouseLeave(); - }, [connection]); - - // When the mouse hovers an output element, - // call stopPropagation so onMouseLeaveContainer doesn't get called - const onMouseMoveOutput = useCallback( - (e: React.MouseEvent) => { - e.stopPropagation(); - }, - [] - ); - - // disposer - useEffect(() => { - return () => { - // eslint-disable-next-line react-hooks/exhaustive-deps - resizeObserver.current.disconnect(); - }; - }, []); - - // The only content in the iframe is a - // list of components for every cell registered on the frameConnection - return ( -
- {Array.from(connection.modelPositions.entries()) - .sort((entryA, entryB) => entryA[1].y - entryB[1].y) - .map(([id, positions]) => { - return ( -
-
- -
-
- ); - })} -
- ); -}); - -// TODO: does this cause unnecessary renders? -const getOutputOuterStyle = (x: number, y: number) => ({ - left: x, - top: y, - position: "absolute" as "absolute", - padding: "10px", - width: "100%", -}); - -const outputInnerStyle = { - maxWidth: "100%", - width: "100%", -}; - -const containerStyle = { position: "relative" as "relative" }; - -export default Frame; diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/FrameConnection.ts b/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/FrameConnection.ts deleted file mode 100644 index 84c34ce74..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/FrameConnection.ts +++ /dev/null @@ -1,243 +0,0 @@ -import { Engine } from "@typecell-org/engine"; -import { observable, runInAction } from "mobx"; -import { AsyncMethodReturns, Connection, connectToParent } from "penpal"; -import { lifecycle } from "vscode-lib"; -import { CompiledCodeModel } from "../../../../../models/CompiledCodeModel"; -import { ModelOutput } from "../../../components/ModelOutput"; -import { getTypeCellResolver } from "../../../resolver/resolver"; - -import type { VisualizersByPath } from "../../../../extensions/visualizer/VisualizerExtension"; -import { HostBridgeMethods } from "../HostBridgeMethods"; -import { IframeBridgeMethods } from "./IframeBridgeMethods"; -import { ModelReceiver } from "./ModelReceiver"; - -let ENGINE_ID = 0; - -/** - * FrameConnection contains the main logic for communicating with the Host and - * evaluating compiled code from the host. - */ -export class FrameConnection extends lifecycle.Disposable { - public readonly id = ENGINE_ID++; - - /** - * Map of that keeps track of the variables exported by every cell - */ - public readonly outputs = observable.map(undefined, { - deep: false, - }); - - /** - * Map of that keeps track of the positions of every cell. - * These positions are passed in from the host - */ - public readonly modelPositions = observable.map< - string, - { - x: number; - y: number; - } - >(); - - /** - * Penpal postmessage connection to the host - */ - private readonly connection: Connection; - - /** - * Penpal postmessage connection methods exposed by the host - */ - private connectionMethods: AsyncMethodReturns | undefined; - - /** - * The Reactive engine (packages/engine) that evaluates and re-evaluates javascript code - */ - private readonly engine: Engine; - - /** - * A map of modelReceivers that receive code models (javascript source code). - * - the ModelReceiver with key "main" is used for the cells of the main notebook - * - Other modelReceivers are added to this map for TypeCell imports - */ - private readonly modelReceivers = new Map(); - - constructor() { - super(); - this.engine = new Engine(this.getModuleResolver()); - - // mainModelReceiver receives compiled code from the Host via the Bridge - // it then passes compiled code to the reactive Engine which is responsible for - // evaluating (and automatically reevaluating the compiled javascript) - // - // SandboxedExecutionHost: compiles code cells - // --> passes compiled code over the bridge to mainModelReceiver - // --> mainModelReceiver passes the compiled code to the Engine - - // instantiate mainModelReceiver - const mainModelReceiver = this._register(new ModelReceiver()); - this.modelReceivers.set("main", mainModelReceiver); - - // pass the code to the engine by acting as a ModelProvider - this.engine.registerModelProvider(mainModelReceiver); - - // Listen to outputs of evaluated cells - this._register( - this.engine.onOutput(({ model, output }) => { - let modelOutput = this.outputs.get(model.path); - if (!modelOutput) { - modelOutput = this._register( - new ModelOutput(this.engine.observableContext.context) - ); - this.outputs.set(model.path, modelOutput); - } - modelOutput.updateValue(output); - }) - ); - - this.connection = connectToParent({ - // Methods child is exposing to parent - methods: this.methods, - }); - this.initialize().then( - () => { - console.log("FrameConnection connection established"); - }, - (e) => { - console.error("FrameConnection connection failed", e); - } - ); - } - - /** - * We call this when the dimensions of a cell output has changed, - * so we can forward this data to the host - */ - public setDimensions( - path: string, - dimensions: { width: number; height: number } - ) { - this.connectionMethods!.setDimensions(path, dimensions); - } - - /** - * We call this when the user's mouse leaves a Cell Output, - * and forward this event to the host (so it can take back control of mouse events) - */ - public mouseLeave() { - this.connectionMethods!.mouseLeave(); - } - - /** - * getModuleResolver() returns a module resolver that can resolve imports required - * by the evaluated javascript code - */ - private getModuleResolver() { - return getTypeCellResolver( - "mainNotebook", - "frame-" + this.id, - (moduleName) => { - // How to resolve typecell modules (i.e.: `import * as nb from "!@user/notebook`") - - const modelReceiver = new ModelReceiver(); - // TODO: what if we have multiple usage of the same module? - this.modelReceivers.set("modules/" + moduleName, modelReceiver); - this.connectionMethods!.registerTypeCellModuleCompiler(moduleName); - return { - get compiledModels() { - return modelReceiver.compiledModels; - }, - dispose: () => { - modelReceiver.dispose(); - this.connectionMethods!.unregisterTypeCellModuleCompiler( - moduleName - ); - }, - onDidCreateCompiledModel: - modelReceiver.onDidCreateCompiledModel.bind(modelReceiver), - }; - } - ); - } - - /** - * Methods exposed to the host - */ - private methods: IframeBridgeMethods = { - updateModels: async ( - bridgeId: string, - models: { modelId: string; model: { value: string } }[] - ) => { - for (let model of models) { - await this.methods.updateModel(bridgeId, model.modelId, model.model); - } - }, - updateModel: async ( - bridgeId: string, - modelId: string, - model: { value: string } - ) => { - console.log("register model", modelId); - const modelReceiver = this.modelReceivers.get(bridgeId); - if (modelReceiver) { - if (bridgeId === "main" && !this.modelPositions.has(modelId)) { - runInAction(() => { - this.modelPositions.set( - modelId, - observable({ - x: 0, - y: 0, - }) - ); - }); - } - modelReceiver.updateModel(modelId, model); - } else { - throw new Error("unknown bridgeId"); - } - }, - - deleteModel: async (bridgeId: string, modelId: string) => { - const modelReceiver = this.modelReceivers.get(bridgeId); - if (modelReceiver) { - if (bridgeId === "main") { - this.modelPositions.delete(modelId); - } - modelReceiver.deleteModel(modelId); - } else { - throw new Error("unknown bridgeId"); - } - }, - - updatePositions: async ( - id: string, - incomingPositions: { x: number; y: number } - ) => { - // console.log("updatePositions", id, incomingPositions); - let positions = this.modelPositions.get(id); - - runInAction(() => { - if (!positions) { - throw new Error("update positions for unknown model"); - } - positions.x = incomingPositions.x; - positions.y = incomingPositions.y; - }); - }, - ping: async () => { - // console.log("ping received, sending pong"); - return "pong"; - }, - - // For type visualizers (experimental) - updateVisualizers: async (e: VisualizersByPath) => { - for (let [path, visualizers] of Object.entries(e)) { - this.outputs.get(path)!.updateVisualizers(visualizers); - } - }, - }; - - async initialize() { - console.log("initialize FrameConnection"); - this.connectionMethods = await this.connection.promise; - } -} diff --git a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/ModelReceiver.ts b/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/ModelReceiver.ts deleted file mode 100644 index 2e76a2243..000000000 --- a/packages/editor/src/runtime/executor/executionHosts/sandboxed/iframesandbox/ModelReceiver.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { lifecycle, event } from "vscode-lib"; -import { CompiledCodeModel } from "../../../../../models/CompiledCodeModel"; - -/** - * The modelReceiver: - * - tracks models ("code models" are objects containing compiled javascript code) - * received over the bridge from the Host - * - Can be used to pass in to Engine, which (re)evaluates the code - */ -export class ModelReceiver extends lifecycle.Disposable { - private registeredModels = new Map(); - private disposed = false; - - private readonly _onDidCreateCompiledModel: event.Emitter = - this._register(new event.Emitter()); - - public readonly onDidCreateCompiledModel: event.Event = - this._onDidCreateCompiledModel.event; - - public get compiledModels() { - return Array.from(this.registeredModels.values()); - } - - public deleteModel(modelId: string) { - console.log("deleteModel", modelId); - let model = this.registeredModels.get(modelId); - if (model) { - this.registeredModels.delete(modelId); - model.dispose(); - } - } - - public updateModel(modelId: string, model: { value: string }) { - console.log("updateModel", modelId); - let existingModel = this.registeredModels.get(modelId); - if (!existingModel) { - existingModel = new CompiledCodeModel(modelId, model.value); - this.registeredModels.set(modelId, existingModel); - - this._onDidCreateCompiledModel.fire(existingModel); - } else { - existingModel.setValue(model.value); - } - } - - public dispose() { - if (this.disposed) { - throw new Error("ModelForwarder already disposed"); - } - this.disposed = true; - super.dispose(); - } -} diff --git a/packages/editor/src/runtime/executor/resolver/resolver.ts b/packages/editor/src/runtime/executor/resolver/resolver.ts deleted file mode 100644 index 11644e503..000000000 --- a/packages/editor/src/runtime/executor/resolver/resolver.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { - CodeModel, - Engine, - // JSPMResolver, - ESMshResolver, - ImportShimResolver, - ResolvedImport, - SkypackResolver, -} from "@typecell-org/engine"; -import getExposeGlobalVariables from "../lib/exports"; -import { LocalResolver } from "./LocalResolver"; -import { TypeCellCompiledCodeProvider } from "./typecell/TypeCellCompiledCodeProvider"; - -// Used for resolving NPM imports -const esmshResolver = new ESMshResolver(); -const skypackResolver = new SkypackResolver(); -// const jspmResolver = new JSPMResolver(); -const importShimResolver = new ImportShimResolver( - [esmshResolver, skypackResolver], - LocalResolver -); - -const cache = new Map(); - -/** - * The resolver is responsible for resolving imports from user code. - * - * This resolver supports the following: - * - * 1. TypeCell library imports - * - * import * as typecell from "typecell"; - * - * This resolves to the object from ../lib/exports - * - * 2. NPM imports - * - * import * as _ from "lodash"; - * - * This uses the `importShimResolver` to resolve the module via Skypack - * (with some exceptions that are loaded locally via LocalResolver) - * - * 3. TypeCell Notebook imports - * - * import * as nb from "!@username/notebook" - * - * This loads a notebook from TypeCell + compiles and executes it whenever it changes - */ -export function getTypeCellResolver( - documentId: string, - cacheKey: string, - createTypeCellCompiledCodeProvider?: ( - moduleName: string - ) => TypeCellCompiledCodeProvider -) { - // TODO: probably we can just use a random id here, or refactor this all to use class + local cache - const resolveImportNested = async ( - moduleName: string, - forModel: T - ): Promise => { - if (moduleName === "typecell") { - // Resolve the typecell helper library - return { - module: { - default: getExposeGlobalVariables(documentId), - }, - dispose: () => {}, - }; - } - const resolved = await resolveImport( - moduleName, - cacheKey + "$$" + forModel.path, - createTypeCellCompiledCodeProvider - ); - - return resolved; - }; - return resolveImportNested; -} - -async function resolveImport( - moduleName: string, - cacheKey: string, - createTypeCellCompiledCodeProvider?: ( - moduleName: string - ) => TypeCellCompiledCodeProvider -): Promise { - if (!moduleName.startsWith("!@")) { - // It's a regular NPM import like `import * as _ from "lodash"`; - return importShimResolver.resolveImport(moduleName); - } - - // We're loading a TypeCell notebook (e.g.: `import * as nb from "!@user/notebook"`) - if (!createTypeCellCompiledCodeProvider) { - throw new Error("typecell modules not supported"); - } - - const key = [cacheKey, moduleName].join("$$"); - - const cached = cache.get(key); - if (cached) { - return cached; - } - const provider = createTypeCellCompiledCodeProvider(moduleName); - - const engine = new Engine( - getTypeCellResolver(moduleName, key, createTypeCellCompiledCodeProvider) - ); - - engine.registerModelProvider(provider); - - let disposed = false; - const ret = { - module: engine.observableContext.context, - dispose: () => { - if (disposed) { - throw new Error("already disposed"); - } - cache.delete(key); - disposed = true; - engine.dispose(); - provider.dispose(); - }, - }; - cache.set(key, ret); - return ret; -} diff --git a/packages/editor/src/runtime/executor/resolver/typecell/TypeCellCompiledCodeProvider.ts b/packages/editor/src/runtime/executor/resolver/typecell/TypeCellCompiledCodeProvider.ts deleted file mode 100644 index f6f407ae5..000000000 --- a/packages/editor/src/runtime/executor/resolver/typecell/TypeCellCompiledCodeProvider.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { lifecycle, event } from "vscode-lib"; -import { CompiledCodeModel } from "../../../../models/CompiledCodeModel"; - -export type TypeCellCompiledCodeProvider = lifecycle.IDisposable & { - onDidCreateCompiledModel: event.Event; - compiledModels: CompiledCodeModel[]; -}; diff --git a/packages/editor/src/runtime/executor/resolver/typecell/TypeCellModuleCompiler.ts b/packages/editor/src/runtime/executor/resolver/typecell/TypeCellModuleCompiler.ts deleted file mode 100644 index 04645fd26..000000000 --- a/packages/editor/src/runtime/executor/resolver/typecell/TypeCellModuleCompiler.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { autorun, untracked } from "mobx"; -import type * as monaco from "monaco-editor"; -import { parseIdentifier } from "../../../../identifiers"; -import { getTypeCellCodeModel } from "../../../../models/TypeCellCodeModel"; -import { DocConnection } from "../../../../store/DocConnection"; -import SourceModelCompiler from "../../../compiler/SourceModelCompiler"; - -export class TypeCellModuleCompiler extends SourceModelCompiler { - private readonly connection: DocConnection; - private releasePreviousModels: (() => void) | undefined; - - constructor( - private readonly moduleName: string, - monacoInstance: typeof monaco - ) { - super(monacoInstance); - if (!moduleName.startsWith("!@")) { - throw new Error("invalid module name"); - } - - const identifier = parseIdentifier(moduleName.substr(1)); - - this.connection = DocConnection.load(identifier); - - const disposeAutorun = autorun(() => { - const cells = this.connection.tryDoc?.doc.cells; - if (!cells) { - return; - } - untracked(() => { - // untracked, because getModel accesses observable data in the cell (code.tostring) - this.releasePreviousModels?.(); - const models = cells.map((c) => - getTypeCellCodeModel(c, monacoInstance) - ); - models.forEach((m) => { - m.object.acquireMonacoModel(); - this.registerModel(m.object); - }); - this.releasePreviousModels = () => { - models.forEach((m) => { - m.object.releaseMonacoModel(); - m.dispose(); - }); - }; - }); - }); - - this._register({ - dispose: disposeAutorun, - }); - } - - public dispose() { - super.dispose(); - - this.connection.dispose(); - this.releasePreviousModels?.(); - } -} diff --git a/packages/editor/src/runtime/extensions/visualizer/localTest/export.ts b/packages/editor/src/runtime/extensions/visualizer/localTest/export.ts deleted file mode 100644 index af9ce0149..000000000 --- a/packages/editor/src/runtime/extensions/visualizer/localTest/export.ts +++ /dev/null @@ -1 +0,0 @@ -export let variable = "3"; diff --git a/packages/editor/src/runtime/extensions/visualizer/localTest/visualizer.ts b/packages/editor/src/runtime/extensions/visualizer/localTest/visualizer.ts deleted file mode 100644 index b5410597a..000000000 --- a/packages/editor/src/runtime/extensions/visualizer/localTest/visualizer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { TypeVisualizer } from "../../../executor/lib/exports"; - -// @ts-expect-error -export let brokenVisualizer = new TypeVisualizer(); - -export let anyVisualizer = new TypeVisualizer( - (x: any) => "hello", - "test-string" -); - -export let stringVisualizer = new TypeVisualizer( - (x: string) => "hello", - "test-string" -); - -export let numberVisualizer = new TypeVisualizer( - (x: number) => "hello", - "test-number" -); - -export let anyValue = {} as any; diff --git a/packages/editor/src/setupTests.ts b/packages/editor/src/setupTests.ts index d93238b0c..b659a1476 100644 --- a/packages/editor/src/setupTests.ts +++ b/packages/editor/src/setupTests.ts @@ -1 +1,2 @@ -import "./runtime/editor/setupTests"; +// import "./runtime/editor/setupTests"; +export {}; diff --git a/packages/editor/src/store/BackgroundSyncer.browsertest.ts b/packages/editor/src/store/BackgroundSyncer.browsertest.ts new file mode 100644 index 000000000..3ed7390db --- /dev/null +++ b/packages/editor/src/store/BackgroundSyncer.browsertest.ts @@ -0,0 +1,108 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +import { HocuspocusProviderWebsocket } from "@hocuspocus/provider"; + +import { enableMobxBindings } from "@syncedstore/yjs-reactive-bindings"; +import { createWsProvider } from "@typecell-org/shared-test"; +import { expect } from "chai"; +import * as mobx from "mobx"; +import { when } from "mobx"; +import { async } from "vscode-lib"; +import { loginAsNewRandomUser } from "../../tests/util/loginUtil"; +import { SupabaseSessionStore } from "../app/supabase-auth/SupabaseSessionStore"; +import { DocConnection } from "./DocConnection"; +import { TypeCellRemote } from "./yjs-sync/remote/TypeCellRemote"; + +async function initSessionStore(name: string) { + const sessionStore = new SupabaseSessionStore(false, false); + await sessionStore.initialize(); + + await loginAsNewRandomUser(sessionStore, name); + + await when(() => !!sessionStore.coordinators); + await when( + () => sessionStore.coordinators?.userPrefix === sessionStore.userPrefix + ); + return sessionStore; +} + +describe("BackgroundSyncer tests", () => { + let sessionStoreAlice: SupabaseSessionStore; + let sessionStoreBob: SupabaseSessionStore; + let wsProvider: HocuspocusProviderWebsocket; + + before(async () => { + enableMobxBindings(mobx); + }); + + beforeEach(async () => { + wsProvider = createWsProvider("ws://localhost:1234"); + + // initialize the main user we're testing + // await coordinator.initialize(); + + sessionStoreAlice = await initSessionStore("alice"); + sessionStoreBob = await initSessionStore("bob"); + }); + + afterEach(async () => { + await sessionStoreAlice.supabase.auth.signOut(); + sessionStoreAlice.dispose(); + sessionStoreAlice = undefined as any; + await sessionStoreBob.supabase.auth.signOut(); + sessionStoreBob.dispose(); + sessionStoreBob = undefined as any; + wsProvider.destroy(); + }); + + /** + * This test is not directly related to backgroundsyncer, but makes sure that changes to a ydoc are persisted even if we immediately call dispose() + */ + it("reloading a doc still has changes", async () => { + const doc = await DocConnection.create(sessionStoreAlice); + doc.ydoc.getMap("test").set("hello", "world"); + doc.dispose(); + + expect(sessionStoreAlice.documentCoordinator?.documents.size).to.eq(2); + expect(DocConnection.get(doc.identifier, sessionStoreAlice)).to.be + .undefined; + + const reload = await DocConnection.load(doc.identifier, sessionStoreAlice); + const reloadedDoc = await reload.waitForDoc(); + expect(reloadedDoc.ydoc.getMap("test").get("hello")).to.eq("world"); + }); + + it("creates document remotely that was created offline earlier", async () => { + TypeCellRemote.Offline = true; + const doc = await DocConnection.create(sessionStoreAlice); + doc.ydoc.getMap("test").set("hello", "world"); + doc.dispose(); + + await async.timeout(1000); + + // validate that document is kept around by background syncer + expect( + sessionStoreAlice.coordinators?.backgroundSyncer?.numberOfDocumentsSyncing + ).to.eq(2); + + [...sessionStoreAlice.documentCoordinator!.documents.values()].forEach( + (doc) => { + expect(doc.exists_at_remote).to.be.false; + } + ); + + TypeCellRemote.Offline = false; + + await when( + () => + sessionStoreAlice.coordinators?.backgroundSyncer + ?.numberOfDocumentsSyncing === 0 + ); + [...sessionStoreAlice.documentCoordinator!.documents.values()].forEach( + (doc) => { + expect(doc.exists_at_remote).to.be.true; + } + ); + }); +}); diff --git a/packages/editor/src/store/BackgroundSyncer.ts b/packages/editor/src/store/BackgroundSyncer.ts new file mode 100644 index 000000000..bbffab946 --- /dev/null +++ b/packages/editor/src/store/BackgroundSyncer.ts @@ -0,0 +1,79 @@ +import { ObservableSet, autorun } from "mobx"; +import { lifecycle } from "vscode-lib"; +import { DocConnection } from "./DocConnection"; +import { SessionStore } from "./local/SessionStore"; +import { DocumentCoordinator } from "./yjs-sync/DocumentCoordinator"; + +export class BackgroundSyncer extends lifecycle.Disposable { + private initialized = false; + private loadedConnections = new Map(); + private identifiersToSync = new ObservableSet(); + + public get numberOfDocumentsSyncing() { + return this.identifiersToSync.size; + } + + constructor( + private readonly coordinator: DocumentCoordinator, + private readonly sessionStore: SessionStore + ) { + super(); + this._register({ + dispose: () => { + for (const doc of this.loadedConnections.values()) { + doc.dispose(); + } + }, + }); + } + + public async initialize() { + if (this.initialized) { + throw new Error("already initialized"); + } + this.initialized = true; + + const disposeAutorun = autorun(() => { + const ids: string[] = []; + this.coordinator.documents.forEach((docInfo, docId) => { + if (docInfo.needs_save_since || !docInfo.exists_at_remote) { + ids.push(docId); + } + }); + + setTimeout(() => { + // see which resources we need to sync + for (const id of ids) { + if (!this.identifiersToSync.has(id)) { + console.log("bg syncer load", id); + this.identifiersToSync.add(id); + // we simply load the resource (DocConnection). It will create a SyncManager if there isn't one already, and start syncing automatically + this.loadedConnections.set( + id, + DocConnection.load(id, this.sessionStore) + ); + } + } + + // cleanup already synced resources + for (const id of this.identifiersToSync) { + if (!ids.includes(id)) { + // cleanup + console.log("bg syncer unload", id); + this.identifiersToSync.delete(id); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const connection = this.loadedConnections.get(id)!; + connection.dispose(); + this.loadedConnections.delete(id); + } + } + }, 0); // settimeout is needed because otherwise it conflicts with creation in DocumentManager - this is a bit ugly + + this._register({ + dispose: () => { + disposeAutorun(); + }, + }); + }); + } +} diff --git a/packages/editor/src/store/BaseResource.test.ts b/packages/editor/src/store/BaseResource.test.ts new file mode 100644 index 000000000..7d67d77df --- /dev/null +++ b/packages/editor/src/store/BaseResource.test.ts @@ -0,0 +1,198 @@ +/** + * @vitest-environment jsdom + */ + +import { enableMobxBindings } from "@syncedstore/yjs-reactive-bindings"; +import { ChildReference } from "@typecell-org/shared"; +import * as mobx from "mobx"; +import { beforeEach, describe, expect, it } from "vitest"; +import { async, uri } from "vscode-lib"; +import * as Y from "yjs"; +import { Identifier } from "../identifiers/Identifier"; +import { + BaseResource, + UnimplementedBaseResourceExternalManager, +} from "./BaseResource"; +import { InboxResource } from "./InboxResource"; +import { InboxValidator } from "./InboxValidatorStore"; + +enableMobxBindings(mobx); +type Username = string; +type DocId = string; + +type User = { + name: Username; + docs: Record< + DocId, + { + ydoc: Y.Doc; + resource: BaseResource; + resourceAsInbox: InboxResource | undefined; + validator: InboxValidator | undefined; + } + >; + allowedToWriteDocs: Set; +}; + +class TestIdentifier extends Identifier { + constructor(public readonly id: string) { + super(["test"], uri.URI.parse("test://test/" + id)); + } +} + +function syncDocFromUserToUser(fromUser: User, toUser: User, docId: DocId) { + if (!fromUser.allowedToWriteDocs.has(docId)) { + console.warn("skip syncing doc because user is not allowed to write"); + return; + } + const doc1 = fromUser.docs[docId]; + const doc2 = toUser.docs[docId]; + const syncDoc1 = Y.encodeStateAsUpdate(doc1.ydoc); + Y.applyUpdate(doc2.ydoc, syncDoc1); +} + +function syncAllDocsFromUserToUser( + fromUser: User, + toUser: User, + exclude?: DocId[] +) { + for (const docId of Object.keys(fromUser.docs)) { + if (exclude && exclude.includes(docId)) { + continue; + } + syncDocFromUserToUser(fromUser, toUser, docId); + } +} + +function createDocAndAllowAccess(forUsers: User[], docId: DocId) { + for (const user of forUsers) { + // create inbox + const inboxDoc = new Y.Doc(); + user.allowedToWriteDocs.add(docId + "-inbox"); + const inboxBaseResource = new BaseResource( + inboxDoc, + new TestIdentifier(docId + "-inbox") + ); + inboxBaseResource.create("!inbox"); + const resourceAsInbox = inboxBaseResource.getSpecificType( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + InboxResource as any + ); + resourceAsInbox.inboxTarget = "test:test/" + docId; + user.docs[docId + "-inbox"] = { + resourceAsInbox, + resource: inboxBaseResource, + ydoc: inboxDoc, + validator: undefined, + }; + + // create main doc + const ydoc = new Y.Doc(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const manager: any = { + loadInboxResource: async (id: TestIdentifier) => { + // const testIdentifier = new TestIdentifier(id.toString()); + const inbox = user.docs[id.id + "-inbox"].resourceAsInbox; + if (!inbox) { + throw new Error("can't resolve inbox id " + id); + } + return inbox; + }, + }; + manager.prototype = UnimplementedBaseResourceExternalManager; + const resource = new BaseResource(ydoc, new TestIdentifier(docId), manager); + + const validator = new InboxValidator( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + resourceAsInbox!, + ChildReference, + async (idStr) => { + // hacky + const testIdentifier = uri.URI.parse(idStr.replace("test:", "test://")); + const docId = testIdentifier.path.substring(1); + return user.docs[docId].resource; + } + ); + + user.docs[docId] = { + resourceAsInbox: undefined, + resource, + ydoc, + validator, + }; + user.allowedToWriteDocs.add(docId); + } +} + +describe("links", () => { + let user1: User; + let user2: User; + + beforeEach(() => { + user1 = { + name: "user1", + docs: {}, + allowedToWriteDocs: new Set(), + }; + user2 = { + name: "user2", + docs: {}, + allowedToWriteDocs: new Set(), + }; + }); + + it("syncs info two-way", () => { + createDocAndAllowAccess([user1, user2], "doc1"); + + user1.docs.doc1.ydoc.getMap("test").set("hello", "world"); + expect(user2.docs.doc1.ydoc.getMap("test").get("hello")).toBeUndefined(); + syncAllDocsFromUserToUser(user1, user2); + expect(user2.docs.doc1.ydoc.getMap("test").get("hello")).toBe("world"); + + user2.docs.doc1.ydoc.getMap("test").set("hello", "world2"); + expect(user1.docs.doc1.ydoc.getMap("test").get("hello")).toBe("world"); + syncAllDocsFromUserToUser(user2, user1); + expect(user1.docs.doc1.ydoc.getMap("test").get("hello")).toBe("world2"); + }); + + it("does not sync if user is not allowed to write", () => { + createDocAndAllowAccess([user1, user2], "doc1"); + user1.allowedToWriteDocs.delete("doc1"); + + user1.docs.doc1.ydoc.getMap("test").set("hello", "world"); + expect(user2.docs.doc1.ydoc.getMap("test").get("hello")).toBeUndefined(); + syncAllDocsFromUserToUser(user1, user2); + expect(user2.docs.doc1.ydoc.getMap("test").get("hello")).toBeUndefined(); + }); + + it("adds a ref", async () => { + createDocAndAllowAccess([user1, user2], "doc1"); + createDocAndAllowAccess([user1, user2], "doc2"); + + await user1.docs.doc1.resource.addRef( + ChildReference, + new TestIdentifier("doc2") + ); + + expect(user1.docs.doc1.resource.getRefs(ChildReference).length).toBe(1); + expect(user2.docs.doc1.resource.getRefs(ChildReference).length).toBe(0); + syncAllDocsFromUserToUser(user1, user2, ["doc2-inbox"]); + expect(user2.docs.doc1.resource.getRefs(ChildReference).length).toBe(1); + + await new Promise((resolve) => setImmediate(resolve)); // allow autorun to fire + + await async.timeout(100); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expect(user1.docs.doc2.validator!.validRefMessages.length).toBe(1); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expect(user2.docs.doc2.validator!.validRefMessages.length).toBe(0); + + syncAllDocsFromUserToUser(user2, user1); + + await new Promise((resolve) => setImmediate(resolve)); // allow autorun to fire + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + expect(user2.docs.doc2.validator!.validRefMessages.length).toBe(0); + }); +}); diff --git a/packages/editor/src/store/BaseResource.ts b/packages/editor/src/store/BaseResource.ts index 783d04ad4..a680b7a55 100644 --- a/packages/editor/src/store/BaseResource.ts +++ b/packages/editor/src/store/BaseResource.ts @@ -1,64 +1,103 @@ import { makeYDocObservable } from "@syncedstore/yjs-reactive-bindings"; -import { generateKeyBetween } from "fractional-indexing"; -import type * as Y from "yjs"; -import { Identifier } from "../identifiers/Identifier"; -import type { DocConnection } from "./DocConnection"; -import { DocumentResource } from "./DocumentResource"; import { - createRef, - getHashForReference, Ref, ReferenceDefinition, + createRef, + getHashForReference, validateRef, -} from "./Ref"; +} from "@typecell-org/shared/src/Ref"; +import { generateKeyBetween } from "fractional-indexing"; +import type * as Y from "yjs"; +import { createID, getState } from "yjs"; +import { Identifier } from "../identifiers/Identifier"; +import { DocumentResource } from "./DocumentResource"; +import { InboxResource } from "./InboxResource"; +import { Remote } from "./yjs-sync/remote/Remote"; -export type BaseResourceConnection = { - identifier: Identifier; +export type BaseResourceExternalManager = { dispose: () => void; - /** @internal */ - webrtcProvider: { awareness: any } | undefined; // TODO + // eslint-disable-next-line @typescript-eslint/no-explicit-any + awareness: any | undefined; needsFork: boolean; + loadInboxResource: (forIdentifier: Identifier) => Promise; + fork(): Promise; + revert(): Promise; + remote: Remote | undefined; }; + +export const UnimplementedBaseResourceExternalManager: BaseResourceExternalManager = + { + dispose: () => { + // noop + }, + get awareness() { + throw new Error("Not implemented"); + }, + get needsFork(): boolean { + throw new Error("Not implemented"); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + get loadInboxResource(): any { + throw new Error("Not implemented"); + }, + fork(): Promise { + throw new Error("Not implemented"); + }, + revert(): Promise { + throw new Error("Not implemented"); + }, + get remote(): Remote { + throw new Error("Not implemented"); + }, + }; + /** * A resource is an entity definied by a unique id. * All entities extend from BaseResource, which provides support for id, type, and references */ export class BaseResource { - private readonly _identifier: Identifier; - - /** @internal */ - public readonly connection?: DocConnection; - /** @internal */ public constructor( - /** @internal */ protected readonly ydoc: Y.Doc, - connectionOrIdentifier: DocConnection | Identifier + /** @internal */ public readonly ydoc: Y.Doc, + public readonly identifier: Identifier, + private readonly manager: BaseResourceExternalManager = UnimplementedBaseResourceExternalManager ) { makeYDocObservable(ydoc); - if ((connectionOrIdentifier as any).identifier) { - this.connection = connectionOrIdentifier as DocConnection; - this._identifier = this.connection.identifier; - } else { - this._identifier = connectionOrIdentifier as any; - } } - public get identifier() { - return this._identifier; + /** @internal */ + public get title() { + return this.ydoc.getMap("meta").get("title") as string | undefined; + // return this.ydoc.getText("title"); } public get id() { - return this._identifier.toString(); + return this.identifier.toString(); + } + + public get needsFork() { + return this.manager.needsFork; } public get type(): string { - return this.ydoc.getMap("meta").get("type") as any; + return this.ydoc.getMap("meta").get("type") as string; } - // TODO: do / how do we want to expose this? /** @internal */ - public get webrtcProvider() { - return this.connection?.webrtcProvider; + public get awareness() { + return this.manager.awareness; + } + + public fork() { + return this.manager.fork(); + } + + public revert() { + return this.manager.revert(); + } + + public get remote() { + return this.manager.remote; } /** @@ -67,17 +106,19 @@ export class BaseResource { */ public get doc() { return this.getSpecificType( + // eslint-disable-next-line @typescript-eslint/no-explicit-any (window as any).DocumentResource // TODO: hacky to prevent circular ref ); } - private _specificType: any; + private _specificType: unknown; /** @internal */ public getSpecificType( constructor: new ( doc: Y.Doc, - connection: BaseResourceConnection | Identifier + identifier: Identifier, + manager: BaseResourceExternalManager ) => T ): T { if (this._specificType && !(this._specificType instanceof constructor)) { @@ -86,9 +127,9 @@ export class BaseResource { this._specificType = this._specificType || - new constructor(this.ydoc, this.connection || this.identifier); + new constructor(this.ydoc, this.identifier, this.manager); - return this._specificType; + return this._specificType as T; } public create(type: string) { @@ -96,16 +137,18 @@ export class BaseResource { this.ydoc.getMap("meta").set("created_at", Date.now()); } - private get _refs(): Y.Map { - let map: Y.Map = this.ydoc.getMap("refs"); + private get _refs(): Y.Map { + // eslint-disable-next-line prefer-const + let map: Y.Map = this.ydoc.getMap("refs"); return map; } - public getRefs(definition: ReferenceDefinition) { - const ret: Ref[] = []; // TODO: type + public getRefs(definition: T) { + const ret: Ref[] = []; // TODO: type // this.ydoc.getMap("refs").forEach((val, key) => { // this.ydoc.getMap("refs").delete(key); // }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any this.ydoc.getMap("refs").forEach((val: any) => { if ( val.namespace !== definition.namespace || @@ -129,108 +172,113 @@ export class BaseResource { return ret; } - public getRef(definition: ReferenceDefinition, key: string) { + public getRef(definition: ReferenceDefinition, targetId: string) { + const key = getHashForReference(definition, targetId); + return this.getRefByKey(definition, key); + } + + public getRefByKey(definition: ReferenceDefinition, key: string) { const ref = this._refs.get(key); - if (ref && !validateRef(ref, definition)) { + if (!ref) { + return undefined; + } + if (!validateRef(ref, definition)) { throw new Error("unexpected"); // ref with key exists, but doesn't conform to definition } return ref; } - public removeRef(definition: ReferenceDefinition, targetId: string) { - this._refs.delete(getHashForReference(definition, targetId)); + public removeRef(definition: ReferenceDefinition, targetId: Identifier) { + this._refs.delete(getHashForReference(definition, targetId.toString())); // TODO: delete reverse? } public moveRef( definition: ReferenceDefinition, - targetId: string, + targetId: Identifier, index: number ) { - const key = getHashForReference(definition, targetId); - let existing = this.getRef(definition, key); + const key = getHashForReference(definition, targetId.toString()); + const existing = this.getRefByKey(definition, key); if (!existing) { throw new Error("ref not found"); } - if ( - definition.relationship.type === "unique" || - !definition.relationship.sorted - ) { + if (definition.relationship === "unique" || !definition.sorted) { throw new Error("called moveRef on non sorted definition"); } - const refs = this.getRefs(definition); + const refs = this.getRefs(definition).filter( + (r) => r.target !== targetId.toString() + ); + const sortKey = generateKeyBetween( index === 0 ? null : refs[index - 1].sortKey || null, index >= refs.length ? null : refs[index].sortKey || null ); - this._refs.set(key, createRef(definition, targetId, sortKey)); - } - - // public ensureRef( - // definition: ReferenceDefinition, - // targetId: string, - // index?: number, - // checkReverse = true - // ) { - // // const ref = new Ref(definition, targetId); - - // const key = getHashForReference(definition, targetId); - // let existing = this.getRef(definition, key); // TODO: this doesn't work distributed + reverseDoc?, because maybe this document isn't synced - // if (existing) { - // // The document already has this relationship - // if (existing.target !== targetId) { - // // The relationship that exists is different, remove the reverse relationship - // const doc = DocConnection.load(existing.target); // TODO: unload document - - // // TODO ! - // doc.tryDoc!.removeRef(reverseReferenceDefinition(definition), this.id); - // } - // } - // // Add the relationship - // let sortKey: string | undefined; - - // if ( - // definition.relationship.type === "many" && - // definition.relationship.sorted - // ) { - // const refs = this.getRefs(definition).filter( - // (r) => r.target !== targetId - // ); - // if (index === undefined) { - // // append as last item - // sortKey = generateKeyBetween(refs.pop()?.sortKey || null, null); - // } else { - // let sortKeyA = index === 0 ? null : refs[index - 1].sortKey || null; - // let sortKeyB = - // index >= refs.length ? null : refs[index].sortKey || null; - // if (sortKeyA === sortKeyB && sortKeyA !== null) { - // console.warn("unexpected"); - // sortKeyB = null; - // } - // sortKey = generateKeyBetween(sortKeyA, sortKeyB); - // } - // } - - // this._refs.set(key, createRef(definition, targetId, sortKey)); - // if (checkReverse) { - // // Add the reverse relationship - // const reverseDoc = DocConnection.load(targetId); // TODO: unload document - // // TODO ! - // reverseDoc.tryDoc!.ensureRef( - // reverseReferenceDefinition(definition), - // this.id, - // undefined, - // false - // ); - // } - // } + this._refs.set(key, createRef(definition, targetId.toString(), sortKey)); + } + + // TODO: should not be async + public async addRef( + definition: ReferenceDefinition, + targetId: Identifier, + index?: number, + addToTargetInbox = true + ) { + let sortKey: string | undefined; + + if (definition.relationship === "many" && definition.sorted) { + const refs = this.getRefs(definition).filter( + (r) => r.target !== targetId.toString() + ); + if (index === undefined) { + // append as last item + sortKey = generateKeyBetween(refs.pop()?.sortKey || null, null); + } else { + const sortKeyA = index === 0 ? null : refs[index - 1].sortKey || null; + let sortKeyB = + index >= refs.length ? null : refs[index].sortKey || null; + if (sortKeyA === sortKeyB && sortKeyA !== null) { + console.warn("unexpected"); + sortKeyB = null; + } + sortKey = generateKeyBetween(sortKeyA, sortKeyB); + } + } else if (typeof index !== "undefined") { + throw new Error("called addRef with index on non sorted definition"); + } + const key = getHashForReference(definition, targetId.toString()); + const ref = createRef(definition, targetId.toString(), sortKey); + + if (addToTargetInbox) { + const nextId = createID( + this.ydoc.clientID, + getState(this.ydoc.store, this.ydoc.clientID) + ); + + const inbox = await this.manager.loadInboxResource(targetId); + + inbox.inbox.push([ + { + message_type: "ref", + id: ref.id, + namespace: ref.namespace, + type: ref.type, + source: this.id, + clock: nextId.client + ":" + nextId.clock, + }, + ]); + + inbox.dispose(); + } + this._refs.set(key, ref); + } public dispose() { // This should always only dispose the connection // BaseResource is not meant to manage other resources, // because BaseResource can be initiated often (in YDocConnection.load), and is not cached - this.connection?.dispose(); + this.manager.dispose(); } } diff --git a/packages/editor/src/store/DocConnection.browsertest.ts b/packages/editor/src/store/DocConnection.browsertest.ts new file mode 100644 index 000000000..7eb62dbdf --- /dev/null +++ b/packages/editor/src/store/DocConnection.browsertest.ts @@ -0,0 +1,128 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +import { HocuspocusProviderWebsocket } from "@hocuspocus/provider"; + +import { enableMobxBindings } from "@syncedstore/yjs-reactive-bindings"; +import { ForkReference } from "@typecell-org/shared"; +import { createWsProvider } from "@typecell-org/shared-test"; +import { expect } from "chai"; +import * as mobx from "mobx"; +import { when } from "mobx"; +import { async } from "vscode-lib"; +import { loginAsNewRandomUser } from "../../tests/util/loginUtil"; +import { SupabaseSessionStore } from "../app/supabase-auth/SupabaseSessionStore"; +import { DocConnection } from "./DocConnection"; +import { InboxValidator } from "./InboxValidatorStore"; + +async function initSessionStore(name: string) { + const sessionStore = new SupabaseSessionStore(false, false); + await sessionStore.initialize(); + + await loginAsNewRandomUser(sessionStore, name); + + await when(() => !!sessionStore.coordinators); + await when( + () => sessionStore.coordinators?.userPrefix === sessionStore.userPrefix + ); + return sessionStore; +} + +describe("DocConnection tests", () => { + let sessionStoreAlice: SupabaseSessionStore; + let sessionStoreBob: SupabaseSessionStore; + let wsProvider: HocuspocusProviderWebsocket; + + before(async () => { + enableMobxBindings(mobx); + }); + + beforeEach(async () => { + wsProvider = createWsProvider("ws://localhost:1234"); + + // initialize the main user we're testing + // await coordinator.initialize(); + + sessionStoreAlice = await initSessionStore("alice"); + sessionStoreBob = await initSessionStore("bob"); + }); + + afterEach(async () => { + await sessionStoreAlice.supabase.auth.signOut(); + sessionStoreAlice.dispose(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sessionStoreAlice = undefined as any; + await sessionStoreBob.supabase.auth.signOut(); + sessionStoreBob.dispose(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sessionStoreBob = undefined as any; + wsProvider.destroy(); + }); + + it("bob cannot modify doc by alice", async () => { + const doc = await DocConnection.create(sessionStoreAlice); + doc.ydoc.getMap("test").set("hello", "world"); + + await when(() => doc.remote?.status === "loaded"); + + const bobDoc = await DocConnection.load(doc.identifier, sessionStoreBob); + const bobResource = await bobDoc.waitForDoc(); + expect(bobResource.ydoc.getMap("test").get("hello")).to.equal("world"); + + bobResource.ydoc.getMap("test").set("hello", "from bob"); + + // even after waiting 1s, the change should not be visible + await async.timeout(1000); + expect(doc.ydoc.getMap("test").get("hello")).to.equal("world"); + }); + + it("can fork a modified read-only doc", async () => { + const doc = await DocConnection.create(sessionStoreAlice); + doc.ydoc.getMap("test").set("hello", "world"); + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await when(() => doc.remote!.status === "loaded"); + + const bobDoc = await DocConnection.load(doc.identifier, sessionStoreBob); + let bobResource = await bobDoc.waitForDoc(); + expect(bobResource.ydoc.getMap("test").get("hello")).to.equal("world"); + + bobResource.ydoc.getMap("test").set("hello", "from bob"); + + // even after waiting 1s, the change should not be visible + await async.timeout(1000); + expect(doc.ydoc.getMap("test").get("hello")).to.equal("world"); + + expect(bobResource.needsFork).to.be.true; + + await async.timeout(1000); + + const fork = await bobResource.fork(); + + expect(fork.ydoc.getMap("test").get("hello")).to.equal("from bob"); + + bobResource = await bobDoc.waitForDoc(); // TODO: we should be able to keep using the old resource + // expect(bobResource.ydoc.getMap("test").get("hello")).to.equal("world"); TODO + + expect(fork.getRefs(ForkReference)).to.have.length(1); + + await async.timeout(1000); + + // TODO: convoluted API + const r = await DocConnection.loadInboxResource( + doc.identifier, + sessionStoreAlice + ); + + // console.log("inbox", r.identifier.toString(), r.ydoc.toJSON()); + + const validator = new InboxValidator(r, ForkReference, (id) => { + const doc = DocConnection.load(id, sessionStoreAlice); + return doc.waitForDoc(); + }); + await async.timeout(1000); // TODO + await when(() => validator.validRefMessages.length > 0); + expect(validator.validRefMessages).to.have.length(1); + expect(validator.validRefMessages[0].source).to.equal( + fork.identifier.toString() + ); + }); +}); diff --git a/packages/editor/src/store/DocConnection.ts b/packages/editor/src/store/DocConnection.ts index 2ee3ffe53..3dfaa4ecc 100644 --- a/packages/editor/src/store/DocConnection.ts +++ b/packages/editor/src/store/DocConnection.ts @@ -1,5 +1,5 @@ -import { createMatrixRoom } from "matrix-crdt"; import { + ObservableMap, computed, makeObservable, observable, @@ -8,84 +8,39 @@ import { when, } from "mobx"; import { lifecycle } from "vscode-lib"; -import { MatrixClientPeg } from "../app/matrix-auth/MatrixClientPeg"; import { BaseResource } from "./BaseResource"; -import { uri } from "vscode-lib"; +import { ForkReference } from "@typecell-org/shared"; import * as Y from "yjs"; -import { parseIdentifier, tryParseIdentifier } from "../identifiers"; -import { FileIdentifier } from "../identifiers/FileIdentifier"; -import { GithubIdentifier } from "../identifiers/GithubIdentifier"; -import { HttpsIdentifier } from "../identifiers/HttpsIdentifier"; +import { parseIdentifier } from "../identifiers"; import { Identifier } from "../identifiers/Identifier"; -import { MatrixIdentifier } from "../identifiers/MatrixIdentifier"; -import { getStoreService } from "./local/stores"; -import FetchSyncManager from "./yjs-sync/FetchSyncManager"; -import { YDocFileSyncManager } from "./yjs-sync/FilebridgeSyncManager"; -import GithubSyncManager from "./yjs-sync/GithubSyncManager"; -import { existsLocally, getIDBIdentifier } from "./yjs-sync/IDBHelper"; +import { TypeCellIdentifier } from "../identifiers/TypeCellIdentifier"; +import { InboxResource } from "./InboxResource"; +import { SessionStore } from "./local/SessionStore"; import { SyncManager } from "./yjs-sync/SyncManager"; -import { YDocSyncManager } from "./yjs-sync/YDocSyncManager"; -const cache = new Map(); +const cache = new ObservableMap(); /** * Encapsulates a Y.Doc and exposes the Resource the Y.Doc represents */ export class DocConnection extends lifecycle.Disposable { - private disposed: boolean = false; + private disposed = false; private _refCount = 0; /** @internal */ - private manager: SyncManager | undefined = undefined; - private _baseResourceCache: - | undefined - | { - baseResource: BaseResource; - doc: Y.Doc; - }; - - // TODO: move to YDocSyncManager? - private clearAndInitializeManager(forkSourceIdentifier?: Identifier) { - runInAction(() => { - const sessionStore = getStoreService().sessionStore; - sessionStore.enableGuest(); - this._baseResourceCache = undefined; - this.manager?.dispose(); - this.manager = undefined; - if (this.identifier instanceof FileIdentifier) { - this.manager = new YDocFileSyncManager(this.identifier); - this.manager.initialize(); - } else if (this.identifier instanceof GithubIdentifier) { - this.manager = new GithubSyncManager(this.identifier); - this.manager.initialize(); - } else if (this.identifier instanceof HttpsIdentifier) { - this.manager = new FetchSyncManager(this.identifier); - this.manager.initialize(); - } else if (this.identifier instanceof MatrixIdentifier) { - if (typeof sessionStore.user !== "string") { - this.manager = new YDocSyncManager( - this.identifier, - sessionStore.user.matrixClient, - sessionStore.user.type === "matrix-user" - ? sessionStore.user.userId - : undefined, - forkSourceIdentifier - ); - this.manager.initialize(); - } - } else { - throw new Error("unsupported identifier"); - } - }); - } + private manager: SyncManager | undefined; + private _baseResourceCache: undefined | BaseResource; protected constructor( public readonly identifier: Identifier, - forkSourceIdentifier?: Identifier + syncManager: SyncManager, + private readonly sessionStore: SessionStore ) { super(); + this.manager = syncManager; + // add "manager" to satisfy TS as it's a private field // https://mobx.js.org/observable-state.html#limitations makeObservable(this, { @@ -95,16 +50,32 @@ export class DocConnection extends lifecycle.Disposable { manager: observable.ref, }); - let forked = false; const dispose = reaction( - () => getStoreService().sessionStore.user, - () => { - this.clearAndInitializeManager( - forked ? undefined : forkSourceIdentifier - ); - forked = true; + () => this.sessionStore.documentCoordinator, + async () => { + // console.log( + // "sessionstore change", + // this.sessionStore.documentCoordinator + // ); + + this._baseResourceCache = undefined; + this.manager?.dispose(); + let newManager: SyncManager | undefined = undefined; + + if (this.sessionStore.user && this.sessionStore.documentCoordinator) { + // This is hacky, we should clear cache and probably dispose all docconnections when the sessionstore changes + newManager = SyncManager.load(identifier, this.sessionStore); + const cacheKey = DocConnection.getCacheKey( + this.sessionStore, + identifier + ); + cache.set(cacheKey, this); + } + runInAction(() => { + this.manager = newManager; + }); }, - { fireImmediately: true } + { fireImmediately: false } ); this._register({ @@ -124,17 +95,13 @@ export class DocConnection extends lifecycle.Disposable { } /** @internal */ - public get webrtcProvider() { - return this.manager; + public get awareness() { + // console.log("awareness", this.manager?.awareness); + return this.manager?.awareness; } - /** @internal */ - public get matrixProvider() { - if (this.manager instanceof YDocSyncManager) { - return this.manager.matrixProvider; - } else { - throw new Error("not supported"); - } + public get remote() { + return this.manager?.remote; } public get needsFork() { @@ -155,79 +122,100 @@ export class DocConnection extends lifecycle.Disposable { * @type {("loading" | "not-found" | BaseResource)} * @memberof DocConnection */ - public get doc() { + public get doc(): "loading" | "not-found" | BaseResource { if (!this.manager) { - return "loading" as "loading"; + return "loading" as const; } - const ydoc = this.manager.doc; + const ydoc = this.manager.docOrStatus; if (typeof ydoc === "string") { return ydoc; } - if (!this._baseResourceCache || this._baseResourceCache.doc !== ydoc) { - this._baseResourceCache = { - doc: ydoc, - baseResource: new BaseResource(ydoc, this), - }; + if (!this._baseResourceCache || this._baseResourceCache.ydoc !== ydoc) { + this._baseResourceCache = new BaseResource(ydoc, this.identifier, this); } - return this._baseResourceCache.baseResource; + return this._baseResourceCache; } public async revert() { - if (!(this.manager instanceof YDocSyncManager)) { - throw new Error("revert() only supported on YDocSyncManager"); - } - const manager = this.manager; - if (!manager) { - throw new Error("revert() called without manager"); - } - await manager.deleteLocalChanges(); - this.clearAndInitializeManager(); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const manager = await this.manager!.clearAndReload(); + runInAction(() => { + this.manager = manager; + }); } // TODO: fork github or file sources public async fork() { - if (!getStoreService().sessionStore.loggedInUserId) { - throw new Error("not logged in"); + if (!this.sessionStore.loggedInUserId) { + throw new Error("fork, but not logged in"); + } + + const doc = this.tryDoc; + if (!doc) { + throw new Error("fork, but no doc"); + } + + const connection = await DocConnection.createNewDocConnection( + this.sessionStore.getIdentifierForNewDocument(), + this.sessionStore, + doc.ydoc + ); + + await this.revert(); + + const forkDoc = await connection.waitForDoc(); + + await forkDoc.addRef(ForkReference, this.identifier); + return forkDoc; + } + + private static async createNewDocConnection( + identifier: Identifier, + sessionStore: SessionStore, + forkSource?: Y.Doc, + isInbox = false + ) { + const cacheKey = DocConnection.getCacheKey(sessionStore, identifier); + if (cache.has(cacheKey)) { + throw new Error("unexpected, doc already in cache"); + } + + if (!isInbox && identifier.toString().endsWith("/.inbox")) { + throw new Error("unexpected, inbox identifier"); } - let tryN = 1; - - do { - // TODO - if (!(this.identifier instanceof MatrixIdentifier)) { - throw new Error("not implemented"); - } - // TODO: test - const newIdentifier = new MatrixIdentifier( - uri.URI.from({ - scheme: this.identifier.uri.scheme, - // TODO: use user authority, - path: - getStoreService().sessionStore.loggedInUserId + - "/" + - this.identifier.document + - (tryN > 1 ? "-" + tryN : ""), - }) + if (!isInbox) { + const inboxIdentifier = parseIdentifier( + identifier.toString() + "/.inbox" + ); + const inboxConnection = await DocConnection.createNewDocConnection( + inboxIdentifier, + sessionStore, + undefined, + true ); - const result = await DocConnection.create(newIdentifier, this.identifier); + const doc = await inboxConnection.waitForDoc(); + doc.create("!inbox"); + doc.ydoc.getMap("inboxmeta").set("target", identifier.toString()); // TODO - // TODO: store fork info in document + // we can dispose immediately, bg manager is responsible for syncing the change + inboxConnection.dispose(); + } - if (result === "invalid-identifier") { - throw new Error("unexpected invalid-identifier when forking"); - } + const manager = SyncManager.create(identifier, sessionStore, forkSource); - if (result !== "already-exists") { - if (result instanceof BaseResource) { - } - return result; - } - tryN++; - } while (true); + const connection = new DocConnection( + manager.identifier, + manager, + sessionStore + ); + cache.set(cacheKey, connection); + connection.addRef(); + return connection; } public async waitForDoc() { @@ -241,82 +229,82 @@ export class DocConnection extends lifecycle.Disposable { return doc; } - // public async reinitialize() { - // console.log("reinitialize", this.identifier.id); - // runInAction(() => { - // this.doc = "loading"; - // }); - // this.manager.dispose(); - // await this.initializeNoCatch(); - // } - - public static async create( - id: string | { owner: string; document: string }, - forkSourceIdentifier?: Identifier - ) { - const sessionStore = getStoreService().sessionStore; - if (!sessionStore.loggedInUserId) { - throw new Error("no user available on create document"); - } - const identifier = tryParseIdentifier(id); + public loadInboxResource = (id: Identifier) => + DocConnection.loadInboxResource(id, this.sessionStore); - if (identifier === "invalid-identifier") { - return identifier; + public static async loadInboxResource( + id: Identifier, + sessionStore: SessionStore + ): Promise { + if (!(id instanceof TypeCellIdentifier)) { + throw new Error( + "unimplemented, only typecellidentifier supported for loadInboxResource" + ); } - - if (!(identifier instanceof MatrixIdentifier)) { - throw new Error("invalid identifier"); + if (id.toString().endsWith("/.inbox")) { + throw new Error("unexpected, inbox identifier"); } + // console.log("loadInboxResource", id.toString() + "/.inbox"); + const doc = DocConnection.load( + parseIdentifier(id.toString() + "/.inbox"), + sessionStore + ); + const ret = await doc.waitForDoc(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const inbox = ret.getSpecificType(InboxResource as any); + return inbox; + } - // TODO: check authority - if (identifier.owner !== sessionStore.loggedInUserId) { - throw new Error("not authorized to create this document"); + // TODO: async or not? + public static async create(sessionStore: SessionStore) { + if (!sessionStore.loggedInUserId) { + // Note: can happen on sign up + console.warn( + "DocConnection: no loggedInUserId available on create document" + ); } - if ( - await existsLocally( - getIDBIdentifier(identifier.toString(), sessionStore.loggedInUserId) - ) - ) { - return "already-exists"; - } + const identifier = sessionStore.getIdentifierForNewDocument(); - // TODO (security): user2 can create a room @user1/doc - const remoteResult = await createMatrixRoom( - MatrixClientPeg.get(), - identifier.roomName, - "public-read" + // TODO: async or not? + const connection = await DocConnection.createNewDocConnection( + identifier, + sessionStore ); - if (remoteResult === "already-exists") { - return remoteResult; - } + return connection.waitForDoc(); + } - if (remoteResult === "offline" || remoteResult.status === "ok") { - // TODO: add to pending if "offline" - if (remoteResult === "offline") { - // create local-first - } - const connection = await DocConnection.load(id, forkSourceIdentifier); - return connection.waitForDoc(); + public static get( + identifier: string | Identifier, + sessionStore: SessionStore + ) { + if (!(identifier instanceof Identifier)) { + identifier = parseIdentifier(identifier); } - return remoteResult; + const connection = cache.get( + DocConnection.getCacheKey(sessionStore, identifier) + ); + return connection; } public static load( - identifier: string | { owner: string; document: string } | Identifier, - forkSourceIdentifier?: Identifier + identifier: string | Identifier, + sessionStore: SessionStore ) { - // TODO if (!(identifier instanceof Identifier)) { identifier = parseIdentifier(identifier); } - let connection = cache.get(identifier.toString()); + const cacheKey = DocConnection.getCacheKey(sessionStore, identifier); + let connection = cache.get(cacheKey); if (!connection) { - connection = new DocConnection(identifier, forkSourceIdentifier); - cache.set(identifier.toString(), connection); + // console.log("DocConnection load debug", cacheKey); + const syncManager = SyncManager.load(identifier, sessionStore); + + connection = new DocConnection(identifier, syncManager, sessionStore); + cache.set(cacheKey, connection); } connection.addRef(); return connection; @@ -339,9 +327,19 @@ export class DocConnection extends lifecycle.Disposable { this._baseResourceCache = undefined; this.manager?.dispose(); - this.manager = undefined; - cache.delete(this.identifier.toString()); + cache.delete(this.getCacheKey()); this.disposed = true; } } + + private getCacheKey() { + return DocConnection.getCacheKey(this.sessionStore, this.identifier); + } + + private static getCacheKey( + sessionStore: SessionStore, + identifier: Identifier + ) { + return sessionStore.userPrefix + identifier.toString(); + } } diff --git a/packages/editor/src/store/DocumentResource.ts b/packages/editor/src/store/DocumentResource.ts index cf32e0e09..177940f14 100644 --- a/packages/editor/src/store/DocumentResource.ts +++ b/packages/editor/src/store/DocumentResource.ts @@ -1,46 +1,63 @@ -import * as _ from "lodash"; import type * as Y from "yjs"; -import { CellListModel } from "../models/CellListModel"; -import { BaseResource } from "./BaseResource"; -import { DocConnection } from "./DocConnection"; +import { Identifier } from "../identifiers/Identifier"; +import { + BaseResource, + BaseResourceExternalManager, + UnimplementedBaseResourceExternalManager, +} from "./BaseResource"; /** * A resource with multiple cells, used for either the Notebook or Richtext built-in types */ export class DocumentResource extends BaseResource { /** @internal */ - constructor(ydoc: Y.Doc, connection: DocConnection) { - super(ydoc, connection); + constructor( + ydoc: Y.Doc, + identifier: Identifier, + manager: BaseResourceExternalManager = UnimplementedBaseResourceExternalManager + ) { + super(ydoc, identifier, manager); if (this.type !== "!notebook" && this.type !== "!richtext") { throw new Error("invalid type for DocumentResource"); } } - /** @internal */ - public get title(): Y.Text { - return this.ydoc.getText("title"); + public get title(): string | undefined { + const baseTitle = super.title; + if (baseTitle) { + return baseTitle; + } + + // navigate to block (via blockgroup / blockcontainer) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const firstBlock = (this.data.firstChild as any)?.firstChild?.firstChild; + if (firstBlock?.nodeName === "heading") { + return firstBlock.firstChild?.toString(); + } + + return undefined; + // let cell = this.cells[0]; + // if (!cell || cell.language !== "markdown") { + // return undefined; + // } + + // const match = cell.code.toJSON().match(/^# (.*)$/m); + // if (match) { + // return match[1].trim(); + // } + + // return undefined; } /** @internal */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any public get comments(): Y.Map { return this.ydoc.getMap("comments"); } /** @internal */ public get data(): Y.XmlFragment { - let xml = this.ydoc.getXmlFragment("doc"); + const xml = this.ydoc.getXmlFragment("doc"); return xml; } - - private _getCellListMemoized = _.memoize( - (data: Y.XmlFragment) => new CellListModel(this.id, data) - ); - - public get cellList() { - return this._getCellListMemoized(this.data); - } - - public get cells() { - return this.cellList.cells; - } } diff --git a/packages/editor/src/store/DocumentResourceModelProvider.ts b/packages/editor/src/store/DocumentResourceModelProvider.ts new file mode 100644 index 000000000..c5446063b --- /dev/null +++ b/packages/editor/src/store/DocumentResourceModelProvider.ts @@ -0,0 +1,113 @@ +import { BasicCodeModel } from "@typecell-org/shared"; +import { autorun } from "mobx"; +import { event, lifecycle } from "vscode-lib"; +import * as Y from "yjs"; +import { Identifier } from "../identifiers/Identifier"; +import { DocConnection } from "./DocConnection"; +import { SessionStore } from "./local/SessionStore"; + +type ModelProvider = { + onDidCreateModel: event.Event; + models: BasicCodeModel[]; +}; + +export class DocumentResourceModelProvider + extends lifecycle.Disposable + implements ModelProvider +{ + private readonly connection: DocConnection; + private readonly modelMap = new Map(); + + private readonly _onDidCreateModel: event.Emitter = + this._register(new event.Emitter()); + + public readonly onDidCreateModel: event.Event = + this._onDidCreateModel.event; + + public get models() { + return Array.from(this.modelMap.values()); + } + + constructor(identifier: Identifier, sessionStore: SessionStore) { + super(); + + this.connection = DocConnection.load(identifier, sessionStore); + + // TODO: on every change we loop all contents. We can make this more efficient using a yjs observer + const disposeAutorun = autorun(() => { + const data = this.connection.tryDoc?.doc.data; + if (!data) { + return; + } + const codeNodes = data.querySelectorAll("monaco"); + const seenIds = new Set(); + const createdModels = new Set(); + + for (const node of codeNodes) { + if (!(node instanceof Y.XmlElement)) { + throw new Error("should be xml element"); + } + const id = (node.parent as Y.XmlElement).getAttribute("id"); + if (!id) { + throw new Error("no id specified"); + } + + const code = node.firstChild; + if (!code || !(code instanceof Y.XmlText)) { + throw new Error("should be text"); + } + + const attrLanguage = node.getAttribute("language"); + if (!attrLanguage) { + throw new Error("no language specified"); + } + + seenIds.add(id); + let model = this.modelMap.get(id); + if (model) { + if (model.language !== attrLanguage) { + model.dispose(); + model = undefined; + } else { + model.setValue(code.toString()); + } + } + + if (!model) { + model = new BasicCodeModel( + "!" + identifier.toString() + "/" + id + ".cell.tsx", + code.toString(), + attrLanguage + ); + this.modelMap.set(id, model); + createdModels.add(model); + } + } + + for (const [id, model] of this.modelMap) { + if (!seenIds.has(id)) { + model.dispose(); + this.modelMap.delete(id); + } + } + + for (const model of createdModels) { + this._onDidCreateModel.fire(model); + } + }); + + this._register({ + dispose: disposeAutorun, + }); + } + + public dispose() { + super.dispose(); + + this.connection.dispose(); + for (const model of this.modelMap.values()) { + model.dispose(); + } + this.modelMap.clear(); + } +} diff --git a/packages/editor/src/store/InboxResource.ts b/packages/editor/src/store/InboxResource.ts new file mode 100644 index 000000000..8727a6916 --- /dev/null +++ b/packages/editor/src/store/InboxResource.ts @@ -0,0 +1,94 @@ +import { ReferenceDefinition } from "@typecell-org/shared/src/Ref"; +import * as Y from "yjs"; +import { Identifier } from "../identifiers/Identifier"; +import { + BaseResource, + BaseResourceExternalManager, + UnimplementedBaseResourceExternalManager, +} from "./BaseResource"; + +export type RefInboxMessage = { + message_type: "ref"; + id: string; + namespace: T["namespace"]; + type: T["type"]; + source: string; + clock: string; +}; + +// TODO: make sure inbox is an append-only array +export class InboxResource extends BaseResource { + /** @internal */ + constructor( + ydoc: Y.Doc, + identifier: Identifier, + manager: BaseResourceExternalManager = UnimplementedBaseResourceExternalManager + ) { + super(ydoc, identifier, manager); + if (this.type !== "!inbox") { + throw new Error("invalid type for InboxResource: " + this.type); + } + } + + public get inboxTarget() { + const ret = this.ydoc.getMap("inboxmeta").get("target"); + if (typeof ret !== "string" || !ret) { + throw new Error("invalid inbox target"); + } + return ret; + } + + public set inboxTarget(target: string) { + if (this.ydoc.getMap("inboxmeta").get("target")) { + // TODO: listen for this and prevent updates that do this + throw new Error("cannot change inbox target"); + } + this.ydoc.getMap("inboxmeta").set("target", target); + } + + /** @internal */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + public get inbox(): Y.Array> { + return this.ydoc.getArray("inbox"); + } + + public getRefMessages(referenceDefinition: T) { + const messages: RefInboxMessage[] = []; + + this.inbox.forEach((item: { [key: string]: unknown }) => { + if (item.message_type !== "ref") { + return; + } + + if (item.namespace !== referenceDefinition.namespace) { + return; + } + + if (item.type !== referenceDefinition.type) { + return; + } + + if (typeof item.id !== "string" || !item.id) { + return; + } + + if (typeof item.source !== "string" || !item.source) { + return; + } + + if (typeof item.clock !== "string" || !item.clock) { + return; + } + + messages.push({ + message_type: item.message_type, + id: item.id, + namespace: item.namespace, + type: item.type, + source: item.source, + clock: item.clock, + }); + }); + return messages; + } +} diff --git a/packages/editor/src/store/InboxValidatorStore.ts b/packages/editor/src/store/InboxValidatorStore.ts new file mode 100644 index 000000000..f49ab2f34 --- /dev/null +++ b/packages/editor/src/store/InboxValidatorStore.ts @@ -0,0 +1,164 @@ +import { ReferenceDefinition } from "@typecell-org/shared"; +import { error } from "@typecell-org/util"; +import { autorun } from "mobx"; +import { lifecycle } from "vscode-lib"; +import * as Y from "yjs"; + +import { BaseResource } from "./BaseResource"; +import { InboxResource, RefInboxMessage } from "./InboxResource"; + +/* + * References are bi-directional links between documents. + * They are stored in one Resource (the source) and point to another Resource (the target). + * Any document also has a public append-only inbox where other documents can send messages. + * This inbox is used to store "back"-references. + * + * This system is used so that access control is governed by the source document, but anyone can post "backreferences" to a target document + + * This class is responsible for validating ref-messages (backreferences) in the public inbox of a resource. + * + * It validates messages by: + * - checking if the message type / reference is valid + * - loading the source document where the ref should be stored, and wait to make sure that it's up to date (has the document "update" indicated by the clock in the message) + * - checking if the source document has the ref was indicated by the message + * + * An invalid message can either be caused by: + * - a malformated message + * - an "illegal message": a message was posted to the inbox, but the original ref was not ("legally") created + * - a subsumed message: the original ref doesn't exist anymore or has been replaced + * */ +export class InboxValidator< + T extends ReferenceDefinition +> extends lifecycle.Disposable { + // 3 message states: valid, invalid, pending + // - a message cannot transition from invalid to any other state + // - a message can transition from pending to valid or invalid + // - a message can transition from valid to invalid, for example if a reference has been changed / removed + + private readonly invalidMessages = new Set(); + private readonly validMessages = new Set(); + private readonly pendingMessages = new Set(); + + // TODO: store this somewhere locally + private readonly seenMessages = new Set(); + + private readonly documentDisposers = new Map void>(); + + /** @internal */ + constructor( + private readonly inbox: InboxResource, + private referenceDefinition: T, + loader: (idString: string) => Promise + ) { + super(); + const dispose = autorun(() => { + this.allRefMessages.forEach(async (message) => { + // console.log("message", message); + if (this.seenMessages.has(message.id)) { + return; + } + this.seenMessages.add(message.id); + this.pendingMessages.add(message.id); + + const resource = await loader(message.source); + const handler = () => { + this.updateMessageStateFromResource(message, resource); + }; + resource.ydoc.on("update", handler); + handler(); // initial check + this.documentDisposers.set(message.id, () => { + resource.ydoc.off("update", handler); + resource.dispose(); + }); + }); + }); + + this._register({ + dispose, + }); + + this._register({ + dispose: () => { + this.documentDisposers.forEach((dispose) => dispose()); + }, + }); + } + + private updateMessageStateFromResource( + message: RefInboxMessage, + resource: BaseResource + ) { + if (this.invalidMessages.has(message.id)) { + throw new Error("invalid should not be checked anymore"); + } + + const result = this.ValidateRefMessage(message, resource); + if (result === true) { + // transition from pending to valid + // or keep from valid to valid (in case it was already validated the lines below are no-ops) + this.validMessages.add(message.id); + this.pendingMessages.delete(message.id); + } else if (result === "wait") { + // do nothing + } else if (result === false) { + // transition from pending or valid to invalid + this.invalidMessages.add(message.id); + this.pendingMessages.delete(message.id); + this.validMessages.delete(message.id); + this.documentDisposers.get(message.id)?.(); + this.documentDisposers.delete(message.id); + } else { + throw new error.UnreachableCaseError(result); + } + } + + private ValidateRefMessage( + message: RefInboxMessage, + resource: BaseResource + ) { + if (message.message_type !== "ref") { + throw new Error("invalid inbox message (ref)"); + } + const [client, clock] = message.clock.split(":"); + const clockNum = parseInt(clock); + const clientNum = parseInt(client); + if (isNaN(clockNum) || isNaN(clientNum)) { + throw new Error("invalid inbox message (clock / client)"); + } + + const state = Y.getState(resource.ydoc.store, clientNum); + if (state < clockNum) { + // we need to wait for the document to be updated + console.log("wait"); + return "wait"; + } + + const ref = resource.getRef( + this.referenceDefinition, + this.inbox.inboxTarget + ); + if (!ref || ref.target !== this.inbox.inboxTarget) { + // console.log("invalid", ref?.target, this.inbox.inboxTarget); + return false; + } + // console.log("valid", ref.target, this.inbox.inboxTarget); + return true; + } + + /** + * This is the list of all ref messages of type referenceDefinition that are currently in the inbox. + */ + private get allRefMessages() { + // console.log("serialize", this.inbox.ydoc.toJSON()); + return this.inbox.getRefMessages(this.referenceDefinition); + } + + /** + * This is the list of all ref messages of type referenceDefinition that are in the inbox and are valid + */ + public get validRefMessages() { + return this.allRefMessages.filter((item) => + this.validMessages.has(item.id) + ); + } +} diff --git a/packages/editor/src/store/PluginResource.ts b/packages/editor/src/store/PluginResource.ts deleted file mode 100644 index e4d042ac2..000000000 --- a/packages/editor/src/store/PluginResource.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type * as Y from "yjs"; -import { NotebookCellModel } from "../app/documentRenderers/notebook/NotebookCellModel"; -import { Identifier } from "../identifiers/Identifier"; -import { BaseResource, BaseResourceConnection } from "./BaseResource"; - -/** - * A Resource defining a plugin. Plugins have a description and a single cell with code, - * which is responsible for registering the plugin hooks. - */ -export default class PluginResource extends BaseResource { - /** @internal */ - constructor(ydoc: Y.Doc, connection: BaseResourceConnection | Identifier) { - super(ydoc, connection as any); // TODO - if (this.type !== "!plugin") { - throw new Error("invalid type for PluginResource"); - } - } - - // TODO: turn into Y.Text - public set description(descr: string) { - this.ydoc.getMap("pluginmeta").set("description", descr); - } - - public get description(): string { - const descr = this.ydoc.getMap("pluginmeta").get("description"); - if (!descr) { - return ""; - } - if (typeof descr !== "string") { - throw new Error("expected string"); - } - return descr; - } - - private _pluginCell: NotebookCellModel | undefined; - - /** @internal */ - public get pluginCell() { - this._pluginCell = this._pluginCell || { - code: this.ydoc.getText("pluginCell"), - id: this.id, - path: "!@" + this.id.substr(1) + "/plugin.tsx", - language: "typescript", - }; - - return this._pluginCell; - } -} diff --git a/packages/editor/src/store/ProfileResource.ts b/packages/editor/src/store/ProfileResource.ts new file mode 100644 index 000000000..c896ceb17 --- /dev/null +++ b/packages/editor/src/store/ProfileResource.ts @@ -0,0 +1,52 @@ +import type * as Y from "yjs"; +import { Identifier } from "../identifiers/Identifier"; +import { + BaseResource, + BaseResourceExternalManager, + UnimplementedBaseResourceExternalManager, +} from "./BaseResource"; + +/** + * A Resource defining a user / organization profile + */ +export default class ProfileResource extends BaseResource { + /** @internal */ + constructor( + ydoc: Y.Doc, + identifier: Identifier, + manager: BaseResourceExternalManager = UnimplementedBaseResourceExternalManager + ) { + super(ydoc, identifier, manager); + if (this.type !== "!profile") { + throw new Error("invalid type for ProfileResource"); + } + } + + public get username(): string { + return this.ydoc.getMap("profile").get("username") as string; + } + + public set username(value: string) { + this.ydoc.getMap("profile").set("username", value); + } + + public get title(): string { + return "@" + this.username; + } + + // TODO: if profile is public, then we can currently see the names of all workspaces + public get workspaces() { + const ret = this.ydoc.getMap("workspaces"); + + return ret; + } + + // these documents (forks) don't have a parent workspace, so we store them on the profile + // (perhaps not the nicest architecture, but we probably want to revisit the concept of forking entirely) + public get forks() { + // we use a map with the same value (identifier) as key and value, effectively using it as a set + const ret = this.ydoc.getMap("forks"); + + return ret; + } +} diff --git a/packages/editor/src/store/ProjectResource.ts b/packages/editor/src/store/ProjectResource.ts index d7a2774b1..a67cbeada 100644 --- a/packages/editor/src/store/ProjectResource.ts +++ b/packages/editor/src/store/ProjectResource.ts @@ -1,6 +1,10 @@ import type * as Y from "yjs"; import { Identifier } from "../identifiers/Identifier"; -import { BaseResource, BaseResourceConnection } from "./BaseResource"; +import { + BaseResource, + BaseResourceExternalManager, + UnimplementedBaseResourceExternalManager, +} from "./BaseResource"; /** * A Resource defining a project directory @@ -9,9 +13,10 @@ export default class ProjectResource extends BaseResource { /** @internal */ constructor( ydoc: Y.Doc, - connectionOrIdentifier: BaseResourceConnection | Identifier + identifier: Identifier, + manager: BaseResourceExternalManager = UnimplementedBaseResourceExternalManager ) { - super(ydoc, connectionOrIdentifier as any); // TODO + super(ydoc, identifier, manager); if (this.type !== "!project") { throw new Error("invalid type for PluginResource"); } diff --git a/packages/editor/src/store/Ref.ts b/packages/editor/src/store/Ref.ts deleted file mode 100644 index 961781079..000000000 --- a/packages/editor/src/store/Ref.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { hash } from "../util/hash"; - -export function createRef( - definition: ReferenceDefinition, - targetId: string, - sortKey?: string -): Ref { - if ( - definition.relationship.type === "many" && - definition.relationship.sorted && - !sortKey - ) { - throw new Error("expected sortKey"); - } - return { - namespace: definition.namespace, - type: definition.type, - target: targetId, - sortKey, - }; -} - -export type Ref = { - namespace: string; - type: string; - target: string; - sortKey?: string; -}; - -export function validateRef( - obj: any, - referenceDefinition?: ReferenceDefinition -): obj is Ref { - if (!obj.namespace || !obj.target || !obj.type) { - throw new Error("invalid ref"); - } - if (referenceDefinition) { - if ( - obj.namespace !== referenceDefinition.namespace || - obj.type !== referenceDefinition.type - ) { - throw new Error("reference not matching definition"); - } - if ( - referenceDefinition.relationship.type === "many" && - referenceDefinition.relationship.sorted - ) { - if (!obj.sortKey) { - throw new Error("no sortkey found"); - } - } else { - if (obj.sortKey) { - throw new Error("found sort key, but not expected"); - } - } - } - return true; -} - -export function getSortedRef(obj: { - namespace: string; - type: string; - target: string; - sortKey: string; -}) { - if (!obj.namespace || !obj.target || !obj.type || !obj.sortKey) { - throw new Error("invalid ref"); - } - return obj; -} - -export type ReferenceDefinition = { - /** - * Owner of the schema - * e.g.: "@yousefed/document" - */ - namespace: string; - /** - * Type of the relation - * e.g.: "child", "parent", "mention" - */ - type: string; - - /** - * e.g.: - * - "parent" is unique, a document can only have 1 parent - * - "child" is not unique, a document can have multiple parents - */ - relationship: { type: "unique" } | { type: "many"; sorted: boolean }; - - /** - * Information needed to get the Reference stored in the "other" document - * (e.g., map from "child" to "parent" and vice versa) - */ - reverseInfo: { - relationship: { type: "unique" } | { type: "many"; sorted: boolean }; - type: string; - }; -}; - -export function getHashForReference( - definition: ReferenceDefinition, - targetId: string -): string { - // uniqueness by namespace + type - let hashcode = hash(definition.namespace) ^ hash(definition.type); - - if (definition.relationship.type === "many") { - // If many of the namspace/type relations can exists - // add uniqueness by targetId - hashcode = hashcode ^ hash(targetId); - } - return hashcode + ""; -} - -export function reverseReferenceDefinition( - definition: ReferenceDefinition -): ReferenceDefinition { - return { - ...definition, - ...definition.reverseInfo, - reverseInfo: { - type: definition.type, - relationship: definition.relationship, - }, - }; -} - -export function createOneToManyReferenceDefinition( - namespace: string, - type: string, - reverseType: string, - sorted: boolean -): ReferenceDefinition { - return { - namespace, - type, - relationship: { type: "many", sorted }, - reverseInfo: { - type: reverseType, - relationship: { type: "unique" }, - }, - }; -} diff --git a/packages/editor/src/store/local/SessionStore.ts b/packages/editor/src/store/local/SessionStore.ts index 20f962590..57d250b01 100644 --- a/packages/editor/src/store/local/SessionStore.ts +++ b/packages/editor/src/store/local/SessionStore.ts @@ -1,41 +1,46 @@ -import { MatrixClient } from "matrix-js-sdk"; -import { computed, makeObservable, observable, runInAction } from "mobx"; -import { arrays, lifecycle } from "vscode-lib"; -import { MatrixAuthStore } from "../../app/matrix-auth/MatrixAuthStore"; -import { MatrixClientPeg } from "../../app/matrix-auth/MatrixClientPeg"; -import { getUserFromMatrixId } from "../../util/userIds"; - -const colors = [ - "#958DF1", - "#F98181", - "#FBBC88", - "#FAF594", - "#70CFF8", - "#94FADB", - "#B9F18D", -]; +import { + computed, + makeObservable, + observable, + reaction, + runInAction, +} from "mobx"; +import { lifecycle } from "vscode-lib"; +import { Identifier } from "../../identifiers/Identifier"; +import { BackgroundSyncer } from "../BackgroundSyncer"; +import { DocConnection } from "../DocConnection"; +import ProfileResource from "../ProfileResource"; +import { AliasCoordinator } from "../yjs-sync/AliasCoordinator"; +import { DocumentCoordinator } from "../yjs-sync/DocumentCoordinator"; /** * The sessionStore keeps track of user related data * (e.g.: is the user logged in, what is the user name, etc) */ -export class SessionStore extends lifecycle.Disposable { - private initialized = false; - public userColor = arrays.getRandomElement(colors)!; +export abstract class SessionStore extends lifecycle.Disposable { + public profileDoc: DocConnection | undefined = undefined; + public get profile() { + return this.profileDoc?.tryDoc?.getSpecificType(ProfileResource); + } + + public abstract storePrefix: string; - public user: + public abstract userColor: string; + + // MUST be implemented as Observable + public abstract user: | "loading" | "offlineNoUser" | { type: "guest-user"; - matrixClient: MatrixClient; } | { - type: "matrix-user"; + type: "user"; fullUserId: string; userId: string; - matrixClient: MatrixClient; - } = "loading"; + profileId: string; + isSignUp: boolean; + }; /** * returns a logged in user or a guest user when available @@ -46,115 +51,118 @@ export class SessionStore extends lifecycle.Disposable { } /** - * returns true if the user is logged in to his own matrix identity. + * returns true if the user is logged in to his / her own identity. * returns false if only a guest user or no user is available. * - * Note that this definition of loggedin is different than in the Matrix-related code, - * in Matrix code (e.g. MatrixAuthStore.loggedIn), a guest user is also considered logged in ("as guest") + * MUST be implemented as Observable (computed) */ - public get isLoggedIn() { - return typeof this.user !== "string" && this.user.type === "matrix-user"; - } + public abstract get isLoggedIn(): boolean; + + public abstract get isLoaded(): boolean; /** * Returns the userId (e.g.: @bret) when logged in, undefined otherwise */ - public get loggedInUserId() { - return typeof this.user !== "string" && this.user.type === "matrix-user" - ? this.user.userId - : undefined; - } + public abstract get loggedInUserId(): string | undefined; + + public abstract logout: () => Promise; - public logout = async () => { - if (!this.isLoggedIn) { - throw new Error("can't logout when not logged in"); - } - await this.matrixAuthStore.logout(); + public abstract initialize(): Promise; - // after logging out, call initialize() to sign in as a guest - await this.matrixAuthStore.initialize(true); - }; + public abstract getIdentifierForNewDocument(): Identifier; - constructor(private matrixAuthStore: MatrixAuthStore) { + constructor(private loadProfile = true) { super(); makeObservable(this, { - user: observable.ref, - isLoggedIn: computed, + documentCoordinator: computed, + aliasCoordinator: computed, + userPrefix: computed, + coordinators: observable.ref, + profileDoc: observable.ref, + profile: computed, }); } - // TODO: should be a reaction to prevent calling twice? - public async enableGuest() { - if (!this.initialized) { - throw new Error( - "enableGuest should only be called after being initialized" - ); - } - - if (this.user === "offlineNoUser") { - await this.matrixAuthStore.initialize(true); - } - } + protected initializeReactions() { + const dispose = reaction( + () => this.userPrefix, + () => { + // console.log(new Date(), "change coordinators", this.userPrefix, "\n\n"); + const userPrefix = this.userPrefix; + if (this.coordinators?.userPrefix === userPrefix) { + return; + } + + this.coordinators?.coordinator.dispose(); + this.coordinators?.aliasStore.dispose(); + this.coordinators?.backgroundSyncer?.dispose(); + runInAction(() => { + this.coordinators = undefined; + this.profileDoc?.dispose(); + this.profileDoc = undefined; + }); - public async initialize() { - if (this.initialized) { - throw new Error("initialize() called when already initialized"); - } - try { - // returns true when: - // - successfully created / restored a user (or guest) - // returns false when: - // - failed restore / create user (e.g.: wanted to register a guest, but offline) - // throws error when: - // - unexpected - await this.matrixAuthStore.initialize(false); - // catch future login state changes triggered by the sdk - this._register( - this.matrixAuthStore.onLoggedInChanged(() => { - this.updateStateFromAuthStore().catch((e) => { - console.error("error initializing sessionstore", e); + if (!userPrefix) { + return; + } + + (async () => { + const coordinator = new DocumentCoordinator(userPrefix); + const coordinators = { + userPrefix, + coordinator: coordinator, + aliasStore: new AliasCoordinator(userPrefix), + backgroundSyncer: + typeof this.user !== "string" && this.user.type !== "guest-user" + ? new BackgroundSyncer(coordinator, this) + : undefined, + }; + await coordinators.coordinator.initialize(); + await coordinators.aliasStore.initialize(); + await coordinators.backgroundSyncer?.initialize(); + runInAction(() => { + if (this.userPrefix === userPrefix) { + // console.log("set coordinators", userPrefix); + this.coordinators = coordinators; + if (typeof this.user !== "string" && this.user.type === "user") { + this.profileDoc = this.loadProfile + ? DocConnection.load(this.user.profileId, this) + : undefined; + } + } }); - }) - ); - this.updateStateFromAuthStore(); - - this.initialized = true; - } catch (err) { - // keep state as "loading" - console.error("error loading session from matrix", err); - } + })(); + }, + { fireImmediately: true } + ); + + this._register({ + dispose, + }); } - /** - * Updates the state of sessionStore based on the internal matrixAuthStore.loggedIn - */ - private async updateStateFromAuthStore() { - if (this.matrixAuthStore.loggedIn) { - const matrixClient = MatrixClientPeg.get(); + public get userPrefix() { + return typeof this.user === "string" + ? undefined + : this.user.type === "guest-user" + ? `user-${this.storePrefix}-guest` + : `user-${this.storePrefix}-${this.user.fullUserId}`; + } - if (matrixClient.isGuestAccount) { - runInAction(() => { - this.user = { - type: "guest-user", - matrixClient, - }; - }); - } else { - // signed in as a real user - runInAction(() => { - this.user = { - type: "matrix-user", - matrixClient, - userId: getUserFromMatrixId(matrixClient.getUserId() as string) - .localUserId, - fullUserId: matrixClient.getUserId(), // TODO: nicer to remove make userId represent the full matrix id instead of having a separate property - }; - }); + public coordinators: + | { + userPrefix: string; + coordinator: DocumentCoordinator; + aliasStore: AliasCoordinator; + backgroundSyncer?: BackgroundSyncer; } - } else { - runInAction(() => { - this.user = "offlineNoUser"; - }); - } + | undefined = undefined; + + public get documentCoordinator() { + return this.coordinators?.coordinator; + } + + public get aliasCoordinator() { + return this.coordinators?.aliasStore; } } diff --git a/packages/editor/src/store/local/navigationStore.ts b/packages/editor/src/store/local/navigationStore.ts deleted file mode 100644 index 793d364e4..000000000 --- a/packages/editor/src/store/local/navigationStore.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IObservableArray, makeObservable, observable } from "mobx"; -import { SessionStore } from "./SessionStore"; - -export class NavigationStore { - // See MenuPortal.tsx for explanation - public menuPortalChildren: { children: IObservableArray }[] = []; - - constructor(private sessionStore: SessionStore) { - makeObservable(this, { - menuPortalChildren: observable.shallow, - }); - } -} diff --git a/packages/editor/src/store/local/pluginStore.ts b/packages/editor/src/store/local/pluginStore.ts deleted file mode 100644 index 66666f6fb..000000000 --- a/packages/editor/src/store/local/pluginStore.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { observable } from "mobx"; -import { DocConnection } from "../DocConnection"; -import PluginResource from "../PluginResource"; - -class PluginStore { - private _plugins = observable.map(undefined, { - deep: false, - }); - - // constructor() { - // makeObservable(this, { - // plugins: observable.shallow, - // }); - // } - - public loadPlugin(id: string) { - if (!this._plugins.has(id)) { - this._plugins.set(id, DocConnection.load(id)); - } - } - - public get plugins() { - const ret = new Set(); - this._plugins.forEach((val) => { - const doc = val.tryDoc; - if (!doc) { - // loading - return; - } - if (doc.type) { - if (doc.type === "!plugin") { - ret.add(doc.getSpecificType(PluginResource)!); - } else { - throw new Error("unexpected, loaded plugin document of wrong type"); - } - } - }); - return ret; - } -} - -export const pluginStore = new PluginStore(); -// pluginStore.loadPlugin("@yousefed/projectplugin"); diff --git a/packages/editor/src/store/local/stores.ts b/packages/editor/src/store/local/stores.ts deleted file mode 100644 index 040bed5c7..000000000 --- a/packages/editor/src/store/local/stores.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MatrixAuthStore } from "../../app/matrix-auth/MatrixAuthStore"; -import { NavigationStore } from "./navigationStore"; -import { SessionStore } from "./SessionStore"; - -class StoreService { - public matrixAuthStore = new MatrixAuthStore(); - public sessionStore = new SessionStore(this.matrixAuthStore); - public navigationStore = new NavigationStore(this.sessionStore); -} - -let storeService: StoreService | undefined; - -export async function initializeStoreService() { - storeService = new StoreService(); - await storeService.sessionStore.initialize(); -} - -export function getStoreService() { - if (!storeService) { - throw new Error("store service not initialized"); - } - return storeService; -} - -// autorun(() => { -// YDocSyncManager.matrixClient = -// typeof sessionStore.user === "string" -// ? undefined -// : sessionStore.user.matrixClient; -// }); diff --git a/packages/editor/src/store/yjs-sync/AliasCoordinator.ts b/packages/editor/src/store/yjs-sync/AliasCoordinator.ts new file mode 100644 index 000000000..23c774923 --- /dev/null +++ b/packages/editor/src/store/yjs-sync/AliasCoordinator.ts @@ -0,0 +1,37 @@ +import { makeYDocObservable } from "@syncedstore/yjs-reactive-bindings"; +import { lifecycle } from "vscode-lib"; +import { IndexeddbPersistence } from "y-indexeddb"; +import * as Y from "yjs"; + +export class AliasCoordinator extends lifecycle.Disposable { + private readonly doc: Y.Doc; + private readonly indexedDBProvider: IndexeddbPersistence; + + constructor(private readonly userId: string) { + super(); + this.doc = new Y.Doc(); + makeYDocObservable(this.doc); + this.indexedDBProvider = new IndexeddbPersistence( + userId + "-aliases", + this.doc + ); + + this._register({ + dispose: () => { + this.doc.destroy(); + }, + }); + } + + public async initialize() { + await this.indexedDBProvider.whenSynced; + } + + public get aliases() { + if (!this.indexedDBProvider.synced) { + console.warn("aliases not initialized"); + // throw new Error("not initialized"); + } + return this.doc.getMap("aliases"); + } +} diff --git a/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts b/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts new file mode 100644 index 000000000..02980e8ef --- /dev/null +++ b/packages/editor/src/store/yjs-sync/DocumentCoordinator.ts @@ -0,0 +1,303 @@ +import { makeYDocObservable } from "@syncedstore/yjs-reactive-bindings"; +import { lifecycle } from "vscode-lib"; +import { IndexeddbPersistence } from "y-indexeddb"; +import * as Y from "yjs"; +import { Identifier } from "../../identifiers/Identifier"; + +export type LocalDoc = { + ydoc: Y.Doc; + meta: DocumentInfo; + idbProvider: IndexeddbPersistence; +}; + +export type DocumentInfo = { + id: string; + created_at: Date; + create_source: "local" | "remote"; + exists_at_remote: boolean; + needs_save_since: Date | undefined; +}; + +export class DocumentCoordinator extends lifecycle.Disposable { + private loadedDocuments = new Map(); + + private readonly doc: Y.Doc; + private readonly indexedDBProvider: IndexeddbPersistence; + + constructor(private readonly userId: string) { + super(); + this.doc = new Y.Doc(); + makeYDocObservable(this.doc); + this.indexedDBProvider = new IndexeddbPersistence( + userId + "-coordinator", + this.doc + ); + + this._register({ + dispose: () => { + this.doc.destroy(); + }, + }); + } + + public async initialize() { + await this.indexedDBProvider.whenSynced; + } + + /** + * Return all info on documents that we have in our local-first storage + */ + public get documents() { + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + return this.doc.getMap("documents"); + } + + /** + * Create and register a new document in our local store + */ + public async createDocument( + identifier: Identifier, + targetYDoc: Y.Doc + ): Promise { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + if (this.documents.has(idStr) || this.loadedDocuments.has(idStr)) { + throw new Error("createDocument: document already exists"); + } + + const meta: DocumentInfo = { + id: idStr, + created_at: new Date(), + create_source: "local", + needs_save_since: new Date(), + exists_at_remote: false, + }; + + this.documents.set(idStr, meta); + + const ret = this.loadDocument(identifier, targetYDoc); + if (ret === "not-found") { + // can't happen, because it's just been created + throw new Error("createDocument: document not found"); + } + return ret; + } + + /** + * Create a document in local storage that has been retrieved from a Remote + */ + public createDocumentFromRemote( + identifier: Identifier, + targetYDoc: Y.Doc + ): LocalDoc { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + if (this.documents.has(idStr) || this.loadedDocuments.has(idStr)) { + throw new Error("createDocument: document already exists"); + } + + const meta: DocumentInfo = { + id: idStr, + created_at: new Date(), + create_source: "remote", + needs_save_since: undefined, + exists_at_remote: true, + }; + + this.documents.set(idStr, meta); + + const ret = this.loadDocument(identifier, targetYDoc); + if (ret === "not-found") { + // can't happen, because it's just been created + throw new Error("createDocumentFromRemote: document not found"); + } + return ret; + } + + // hacky fix for docs / httpidentifier + public async clearIfNotChanged(identifier: Identifier) { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + + // console.log("Coordinator load debug", idStr, this.userId); + if (this.loadedDocuments.has(idStr)) { + // we expect loadDocument only to be called once per document + throw new Error("loadDocument: document already loaded"); + } + + const meta = this.documents.get(idStr); + + if (!meta) { + return "not-found"; + } + + if (meta.needs_save_since) { + return "changed"; + } + + const doc = await this.loadDocument(identifier, new Y.Doc()); + if (doc === "not-found") { + throw new Error("unexpected: doc not found"); + } + await this.deleteLocal(identifier); + doc.ydoc.destroy(); + } + + /** + * Load a local document if we have it in local storage + * Otherwise return "not-found" + */ + public loadDocument( + identifier: Identifier, + targetYDoc: Y.Doc + ): LocalDoc | "not-found" { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + + // console.log("Coordinator load debug", idStr, this.userId); + if (this.loadedDocuments.has(idStr)) { + // we expect loadDocument only to be called once per document + throw new Error("loadDocument: document already loaded"); + } + + const meta = this.documents.get(idStr); + + if (!meta) { + return "not-found"; + } + + targetYDoc.on("update", (_update, origin) => { + // for indexeddb, origin is null + // for typecell (hocuspocus) or matrix, origin has .isRemote = true + if (!origin || origin.isRemote) { + return; + } + // mark change + const meta = this.documents.get(idStr); + + if (!meta) { + throw new Error("document meta not found"); + } + + if (meta.needs_save_since === undefined) { + meta.needs_save_since = new Date(); + this.documents.set(idStr, meta); + } + }); + + const idbProvider = new IndexeddbPersistence( + this.userId + "-doc-" + idStr, + targetYDoc + ); + + const doc: LocalDoc = { + ydoc: targetYDoc, + meta, + idbProvider, + }; + + targetYDoc.on("destroy", () => { + this.loadedDocuments.delete(idStr); + }); + + this.loadedDocuments.set(idStr, doc); + return doc; + } + + /** + * Delete a document from our local storage + */ + public async deleteLocal(identifier: Identifier) { + const idStr = identifier.toString(); + if (!this.indexedDBProvider.synced) { + throw new Error("not initialized"); + } + + const localDoc = this.loadedDocuments.get(idStr); + + if (!localDoc) { + // we expect loadDocument only to be called once per document + throw new Error("loadDocument: document already loaded"); + } + + await localDoc.idbProvider.clearData(); + + this.loadedDocuments.delete(idStr); + this.documents.delete(idStr); + } + + public async markSynced(localDoc: LocalDoc) { + localDoc.meta.needs_save_since = undefined; + this.documents.set(localDoc.meta.id, localDoc.meta); + } + + public async markCreated(localDoc: LocalDoc) { + localDoc.meta.exists_at_remote = true; + this.documents.set(localDoc.meta.id, localDoc.meta); + } + + public async loadFromGuest(identifier: string, targetYdoc: Y.Doc) { + const dbname = "user-tc-guest-doc-" + identifier; // bit hacky, "officially" we don't know the exact source name prefix here + const dbExists = await databaseExists(dbname); + + if (dbExists) { + const guestIndexedDBProvider = new IndexeddbPersistence( + dbname, + targetYdoc + ); + // wait for sync + await new Promise((resolve) => { + guestIndexedDBProvider.once("synced", () => { + resolve(); + }); + }); + guestIndexedDBProvider.destroy(); + console.log("applied changes from guest"); + return true; + } else { + console.log("did not apply changes from guest"); + return false; + } + } +} + +/* +TODO: +- what if open in multiple tabs? can ydoc change? + +- service that listens for documents that need to be synced +- on creating a doc -> create locally, then sync +--> this might be handled automatically +- on opening a doc -> always sync +- on loading a doc -> load from remote, then sync to local + + +*/ + +// https://stackoverflow.com/a/23756653 +async function databaseExists(dbname: string) { + return new Promise((resolve) => { + const req = indexedDB.open(dbname); + let existed = true; + req.onsuccess = function () { + req.result.close(); + if (!existed) { + indexedDB.deleteDatabase(dbname); + } + resolve(existed); + }; + req.onupgradeneeded = function () { + existed = false; + }; + }); +} diff --git a/packages/editor/src/store/yjs-sync/FetchSyncManager.ts b/packages/editor/src/store/yjs-sync/FetchSyncManager.ts deleted file mode 100644 index 03d86e0c3..000000000 --- a/packages/editor/src/store/yjs-sync/FetchSyncManager.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { makeObservable, observable, runInAction } from "mobx"; -import { lifecycle, strings } from "vscode-lib"; - -import * as Y from "yjs"; -import { HttpsIdentifier } from "../../identifiers/HttpsIdentifier"; -import { markdownToYDoc } from "../../integrations/markdown/import"; -import ProjectResource from "../ProjectResource"; -import { SyncManager } from "./SyncManager"; - -export default class FetchSyncManager - extends lifecycle.Disposable - implements SyncManager -{ - public canWrite: boolean = true; // always initialize as true until the user starts trying to make changes - - public doc: "loading" | "not-found" | Y.Doc = "loading"; - - public readonly awareness: any = undefined; - - public constructor(private identifier: HttpsIdentifier) { - super(); - makeObservable(this, { - doc: observable.ref, - canWrite: observable.ref, - }); - } - - private documentUpdateListener = async (update: any, origin: any) => { - if (origin === this) { - // these are updates that came in from MatrixProvider - return; - } - if (origin?.provider) { - // update from peer (e.g.: webrtc / websockets). Peer is responsible for sending to Matrix - return; - } - runInAction(() => (this.canWrite = false)); - }; - - public async initialize() { - try { - await this.initializeNoCatch(); - } catch (e) { - console.error(e); - throw e; - } - } - - private async getNewYDocFromDir(objects: string[]) { - const newDoc = new Y.Doc(); - newDoc.getMap("meta").set("type", "!project"); - const project = new ProjectResource(newDoc, this.identifier); - objects.forEach((object) => { - if (object.endsWith(".md")) { - project.files.set(object, {}); - } - }); - return newDoc; - } - - private async getNewYDocFromFetch() { - if (this.identifier.uri.path.endsWith(".json")) { - const json = await (await fetch(this.identifier.uri.toString())).json(); - return this.getNewYDocFromDir(json); - } else if (this.identifier.uri.path.endsWith(".md")) { - const contents = await ( - await fetch(this.identifier.uri.toString()) - ).text(); - return markdownToYDoc(contents); - } else { - // TODO: this is hacky. We should use json from parent route instead. Revise routing? - const [root, ...remainders] = strings - .trim(this.identifier.uri.path, "/") - .split("/"); - const index = this.identifier.uri.with({ path: root + "/index.json" }); - let json = (await (await fetch(index.toString())).json()) as string[]; - - const prefix = remainders.join("/") + "/"; - json = json.filter((path) => path.startsWith(prefix)); - json = json.map((path) => path.substring(prefix.length)); - - if (!json.length) { - return "not-found" as "not-found"; - } - return this.getNewYDocFromDir(json); - } - } - - private async initializeNoCatch() { - try { - const docData = await this.getNewYDocFromFetch(); - if (docData === "not-found") { - this.doc = "not-found"; - return; - } - this.doc = docData; - // this.doc.on("update", this.documentUpdateListener); - } catch (e) { - console.error(e); - this.doc = "loading"; // TODO: error state? - } - } - - public dispose() { - super.dispose(); - if (typeof this.doc !== "string") { - this.doc.off("update", this.documentUpdateListener); - } - this.doc = "loading"; - } - - public on() {} -} diff --git a/packages/editor/src/store/yjs-sync/FilebridgeSyncManager.ts b/packages/editor/src/store/yjs-sync/FilebridgeSyncManager.ts deleted file mode 100644 index 818955202..000000000 --- a/packages/editor/src/store/yjs-sync/FilebridgeSyncManager.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { readFile, saveFile, Watcher } from "filebridge-client"; -import * as _ from "lodash"; -import { makeObservable, observable } from "mobx"; -import { lifecycle, strings } from "vscode-lib"; -import * as Y from "yjs"; -import { FileIdentifier } from "../../identifiers/FileIdentifier"; -import { xmlFragmentToMarkdown } from "../../integrations/markdown/export"; -import { markdownToYDoc } from "../../integrations/markdown/import"; -import ProjectResource from "../ProjectResource"; -import { SyncManager } from "./SyncManager"; - -function isEmptyDoc(doc: Y.Doc) { - return areDocsEqual(doc, new Y.Doc()); -} - -// NOTE: only changes in doc xml fragment are checked -function areDocsEqual(doc1: Y.Doc, doc2: Y.Doc) { - return _.eq( - (doc1.getXmlFragment("doc").toJSON() as string).replaceAll( - /block-id=".*"/g, - "" - ), - (doc2.getXmlFragment("doc").toJSON() as string).replaceAll( - /block-id=".*"/g, - "" - ) - ); -} - -/** - * Given an identifier, manages local + remote syncing of a Y.Doc - */ -export class YDocFileSyncManager - extends lifecycle.Disposable - implements SyncManager -{ - private _ydoc: Y.Doc; - private watcher: Watcher | undefined; - - public canWrite = true; - - /** - * Get the managed "doc". Returns: - * - a Y.Doc encapsulating the loaded doc if available - * - "not-found" if the document doesn't exist locally / remote - * - "loading" if we're still loading the document - * - * (mobx observable) - * - * @type {("loading" | "not-found" | Y.Doc)} - * @memberof DocConnection - */ - public doc: "loading" | "not-found" | Y.Doc = "loading"; - - public readonly awareness: any = undefined; - - public constructor(public readonly identifier: FileIdentifier) { - super(); - makeObservable(this, { - doc: observable.ref, - canWrite: observable.ref, - }); - - console.log("new docconnection", this.identifier.toString()); - this._ydoc = new Y.Doc({ guid: this.identifier.toString() }); - } - - private async getNewYDocFromDir() { - const pathWithTrailingSlash = this.identifier.path - ? strings.trim(this.identifier.path, "/") + "/" - : ""; - - const newDoc = new Y.Doc(); - newDoc.getMap("meta").set("type", "!project"); - const project = new ProjectResource(newDoc, this.identifier); - - this.watcher = this._register( - new Watcher(pathWithTrailingSlash + "**/*.md") - ); - this._register( - this.watcher.onWatchEvent(async (e) => { - let path = e.path; - if (pathWithTrailingSlash && !path.startsWith(pathWithTrailingSlash)) { - throw new Error("file returned with invalid path"); - } - path = path.substring(pathWithTrailingSlash.length); - if (e.event === "add") { - project.files.set(path, {}); - } else if (e.event === "unlink") { - project.files.delete(path); - } - }) - ); - this._ydoc = this.doc = newDoc; - return newDoc; - } - - private async getNewYDocFromId() { - const ret = await readFile(fetch, this.identifier.path); - if (ret.type === "file") { - await this.getNewYDocFromFile(ret.contents); - } else { - await this.getNewYDocFromDir(); - } - } - - private async getNewYDocFromFile(contents: string) { - const newDoc = markdownToYDoc(contents); - - if (isEmptyDoc(this._ydoc)) { - const update = Y.encodeStateAsUpdate(newDoc); - Y.applyUpdate(this._ydoc, update); - this.doc = this._ydoc; - } else { - if (!areDocsEqual(this._ydoc, newDoc)) { - this._ydoc.destroy(); - this._ydoc = this.doc = newDoc; - } - } - this._ydoc.on("update", this.documentUpdateListener); - - this.watcher = this._register(new Watcher(this.identifier.path)); - - this._register( - this.watcher.onWatchEvent(async (event) => { - if (event.event !== "change") { - // TODO: support onlink - return; - } - const file = await readFile(fetch, this.identifier.path); - - if (file.type !== "file") { - throw new Error("unexpected"); - } - const docData = await this.getNewYDocFromFile(file.contents); - if (!areDocsEqual(this._ydoc, docData)) { - this._ydoc.destroy(); - this._ydoc = this.doc = docData; - this._ydoc.on("update", this.documentUpdateListener); - } - }) - ); - return newDoc; - } - - private getFileFromYDoc(doc: Y.Doc) { - // const contents = await readFile(this.identifier.path); - // const nbData = markdownToNotebook(contents); - if (doc.getMap("meta").get("type") !== "!notebook") { - throw new Error("invalid type"); - } - - let xml = doc.getXmlFragment("doc"); - - return xmlFragmentToMarkdown(xml); - } - - private documentUpdateListener = async (update: any, origin: any) => { - if (origin === this) { - // these are updates that came in from MatrixProvider - return; - } - if (origin?.provider) { - // update from peer (e.g.: webrtc / websockets). Peer is responsible for sending to Matrix - return; - } - await saveFile( - fetch, - this.identifier.path, - this.getFileFromYDoc(this._ydoc) - ); - }; - - public async initialize() { - try { - await this.getNewYDocFromId(); - } catch (e) { - console.error(e); - this.doc = "not-found"; - } - } - - public dispose() { - super.dispose(); - this._ydoc.off("update", this.documentUpdateListener); - } - - public on() {} -} diff --git a/packages/editor/src/store/yjs-sync/IDBHelper.ts b/packages/editor/src/store/yjs-sync/IDBHelper.ts deleted file mode 100644 index 57e8f0600..000000000 --- a/packages/editor/src/store/yjs-sync/IDBHelper.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { IndexeddbPersistence } from "y-indexeddb"; - -export async function existsLocally(idbIdentifier: string) { - const exists = (await (window.indexedDB as any).databases()) - .map((db: IDBDatabase) => db.name) - .includes(idbIdentifier); - return exists; -} - -export function getIDBIdentifier(docId: string, userId: string | undefined) { - const prefix = userId ? "u-" + userId : "guest"; - return `tc-yjs-${prefix}-${docId}`; -} - -export async function waitForIDBSynced( - indexedDBProvider: IndexeddbPersistence -) { - await new Promise((resolve) => { - indexedDBProvider.once("synced", () => { - resolve(); - }); - }); -} diff --git a/packages/editor/src/store/yjs-sync/SyncManager.browsertest.ts b/packages/editor/src/store/yjs-sync/SyncManager.browsertest.ts new file mode 100644 index 000000000..00f97f30e --- /dev/null +++ b/packages/editor/src/store/yjs-sync/SyncManager.browsertest.ts @@ -0,0 +1,346 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +/* eslint-disable @typescript-eslint/no-unused-expressions */ +import { HocuspocusProviderWebsocket } from "@hocuspocus/provider"; +import { enableMobxBindings } from "@syncedstore/yjs-reactive-bindings"; +import { + createDocument, + createHPProvider, + createRandomUser, + createWsProvider, +} from "@typecell-org/shared-test"; +import { uniqueId } from "@typecell-org/util"; +import { expect } from "chai"; +import * as mobx from "mobx"; +import { when } from "mobx"; +import { async } from "vscode-lib"; +import * as Y from "yjs"; +import { loginAsNewRandomUser } from "../../../tests/util/loginUtil"; +import { SupabaseSessionStore } from "../../app/supabase-auth/SupabaseSessionStore"; +import { env } from "../../config/env"; +import { parseIdentifier } from "../../identifiers"; +import { SyncManager } from "./SyncManager"; +import { TypeCellRemote } from "./remote/TypeCellRemote"; + +/** + * Helper function that creates a doc in the backend and loads it into a SyncManager + */ +export async function createDocInBackendAndLoad( + user: Awaited>, + wsProvider: HocuspocusProviderWebsocket, + sessionStore: SupabaseSessionStore, + publicAccessLevel: "read" | "write" | "no-access" = "write" +) { + // const user = await createRandomUser("backend-user"); + + // initialize another user and doc directly via hocuspocus + const backendYDoc = new Y.Doc(); + + // const wsProvider = createWsProvider(); + + const doc = await createDocument(user.user!.id, "", publicAccessLevel); + const ret = await user.supabase.from("documents").insert(doc).select(); + + expect(ret.error).null; + + createHPProvider( + doc.nano_id, + backendYDoc, + user.session?.access_token + "$" + user.session?.refresh_token, + wsProvider + ); + + const identifier = parseIdentifier(doc.nano_id); + + // set some initial data + backendYDoc.getMap("mymap").set("hello", "world"); + + // load document with SyncManager + const manager = SyncManager.load(identifier, sessionStore); + + return { user, doc, backendYDoc, manager, identifier }; +} + +export async function createDocInBackendAndWaitForLoad( + user: Awaited>, + wsProvider: HocuspocusProviderWebsocket, + sessionStore: SupabaseSessionStore, + publicAccessLevel: "read" | "write" | "no-access" = "write" +) { + const ret = await createDocInBackendAndLoad( + user, + wsProvider, + sessionStore, + + publicAccessLevel + ); + + expect(ret.manager.docOrStatus).eq("loading"); + + const manager = await ret.manager.waitTillLoaded(); + + // wait till initial data came in + await when( + () => manager.state.localDoc.ydoc.getMap("mymap").get("hello") === "world" + ); + + return { ...ret, manager }; +} + +// /** +// * Helper function to wait for a MobX dependent condition to eventually succeed +// */ +// async function whenExpect(condition: () => Chai.Assertion) { +// return await when(() => { +// try { +// condition(); +// } catch (e) { +// return false; +// } +// return true; +// }); +// } + +describe("SyncManager tests", () => { + let sessionStore: SupabaseSessionStore; + let alice: Awaited>; + let wsProvider: HocuspocusProviderWebsocket; + + before(async () => { + enableMobxBindings(mobx); + alice = await createRandomUser("alice", env); + }); + + beforeEach(async () => { + TypeCellRemote.Offline = false; + wsProvider = createWsProvider("ws://localhost:1234"); + + // initialize the main user we're testing + // await coordinator.initialize(); + + sessionStore = new SupabaseSessionStore(false, false); + await sessionStore.initialize(); + + await loginAsNewRandomUser(sessionStore, "testuser"); + + // console.log("when", sessionStore.coordinators, sessionStore.userPrefix); + await when(() => !!sessionStore.coordinators); + }); + + afterEach(async () => { + await sessionStore.supabase.auth.signOut(); + sessionStore.dispose(); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sessionStore = undefined as any; + wsProvider.destroy(); + }); + + it("can load an unknown remote document online", async () => { + const { manager } = await createDocInBackendAndWaitForLoad( + alice, + wsProvider, + sessionStore + ); + + expect(manager.state.localDoc.meta.create_source).eq("remote"); + }); + + it("cannot load an unknown remote document offline", async () => { + // TODO: would be nicer to force browser to go offline + TypeCellRemote.Offline = true; + + const { manager } = await createDocInBackendAndLoad( + alice, + wsProvider, + sessionStore + ); + expect(manager.docOrStatus).eq("loading"); + + // validate loading doesn't work, by waiting 1s and validate status is still loading + await async.timeout(1000); + expect(manager.docOrStatus).eq("loading"); + + // go online + TypeCellRemote.Offline = false; + + // validate loading + const loadedManager = await manager.waitTillLoaded(); + + // validate syncing + expect(loadedManager.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + + expect(loadedManager.state.localDoc.meta.create_source).eq("remote"); + }); + + it("can load a known remote document", async () => { + const { manager, identifier } = await createDocInBackendAndWaitForLoad( + alice, + wsProvider, + sessionStore + ); + + // dispose + manager.dispose(); + + // load document + const manager2 = SyncManager.load(identifier, sessionStore); + const loadedManager2 = await manager2.waitTillLoaded(); + + // validate syncing + expect(loadedManager2.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + + expect(loadedManager2.state.localDoc.meta.create_source).eq("remote"); + manager2.dispose(); + }); + + it("can load a known remote document offline", async () => { + const { manager, identifier } = await createDocInBackendAndWaitForLoad( + alice, + wsProvider, + sessionStore + ); + + // dispose + manager.dispose(); + + // go offline + TypeCellRemote.Offline = true; + + // load document + const manager2 = SyncManager.load(identifier, sessionStore); + const loadedManager2 = await manager2.waitTillLoaded(); + + // validate syncing + expect(loadedManager2.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + + expect(loadedManager2.state.localDoc.meta.create_source).eq("remote"); + manager2.dispose(); + }); + + it("can create a new document", async () => { + const id = parseIdentifier(uniqueId.generateId("document")); + // create document + const manager = SyncManager.create(id, sessionStore); + + const loadedManager = await manager.waitTillLoaded(); + loadedManager.state.localDoc.ydoc.getMap("mymap").set("hello", "world"); + + await async.timeout(100); // write data + + manager.dispose(); + + // TODO: both managers could load from local, so this is not a valid test + // validate syncing + const manager2 = SyncManager.load(id, sessionStore); + + const loadedManager2 = await manager2.waitTillLoaded(); + + expect(loadedManager2.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + manager2.dispose(); + }); + + it("can create a new document offline", async () => { + // go offline + TypeCellRemote.Offline = true; + + // create document + + const id = parseIdentifier(uniqueId.generateId("document")); + const manager = SyncManager.create(id, sessionStore); + const loadedManager = await manager.waitTillLoaded(); + + loadedManager.state.localDoc.ydoc.getMap("mymap").set("hello", "world"); + + manager.dispose(); + + // go online + // validate syncing + const manager2 = SyncManager.load(id, sessionStore); + const loadedManager2 = await manager2.waitTillLoaded(); + + expect(loadedManager2.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + manager2.dispose(); + }); + + it("can clear local status and reload", async () => { + const { manager, backendYDoc } = await createDocInBackendAndWaitForLoad( + alice, + wsProvider, + sessionStore, + "read" + ); + + manager.state.localDoc.ydoc.getMap("mymap").set("hello", "world2"); + + // read only, so other doc shouldn't change even after waiting 1s + await async.timeout(1000); + expect(backendYDoc.getMap("mymap").get("hello")).eq("world"); + + // local doc should still reflect change + expect(manager.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world2" + ); + + const manager2 = await manager.clearAndReload(); + const loadedManager2 = await manager2.waitTillLoaded(); + + expect(backendYDoc.getMap("mymap").get("hello")).eq("world"); + expect(loadedManager2.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world" + ); + manager2.dispose(); + manager.dispose(); + }); + + it("can fork a document", async () => { + const { manager, backendYDoc } = await createDocInBackendAndWaitForLoad( + alice, + wsProvider, + sessionStore, + "read" + ); + + manager.state.localDoc.ydoc.getMap("mymap").set("hello", "world2"); + + // read only, so other doc shouldn't change even after waiting 1s + await async.timeout(1000); + expect(backendYDoc.getMap("mymap").get("hello")).eq("world"); + + expect(manager.state.localDoc.ydoc.getMap("mymap").get("hello")).eq( + "world2" + ); + + // fork to a new doc + const forkManager = await SyncManager.create( + parseIdentifier(uniqueId.generateId("document")), + sessionStore, + manager.state.localDoc.ydoc + ); + + // revert existing doc + const newManager = await manager.clearAndReload(); + + const forkManagerLoaded = await forkManager.waitTillLoaded(); + const newManagerLoaded = await newManager.waitTillLoaded(); + + expect(backendYDoc.getMap("mymap").get("hello")).eq("world"); + expect( + forkManagerLoaded.state.localDoc.ydoc.getMap("mymap").get("hello") + ).eq("world2"); + expect( + newManagerLoaded.state.localDoc.ydoc.getMap("mymap").get("hello") + ).eq("world"); + manager.dispose(); + forkManager.dispose(); + newManager.dispose(); + }); +}); diff --git a/packages/editor/src/store/yjs-sync/SyncManager.ts b/packages/editor/src/store/yjs-sync/SyncManager.ts index c53838090..288510e97 100644 --- a/packages/editor/src/store/yjs-sync/SyncManager.ts +++ b/packages/editor/src/store/yjs-sync/SyncManager.ts @@ -1,12 +1,395 @@ +import { + autorun, + computed, + makeObservable, + observable, + runInAction, + when, +} from "mobx"; import { lifecycle } from "vscode-lib"; +import { IndexeddbPersistence } from "y-indexeddb"; import * as Y from "yjs"; +import { FileIdentifier } from "../../identifiers/FileIdentifier"; +import { GithubIdentifier } from "../../identifiers/GithubIdentifier"; +import { HttpsIdentifier } from "../../identifiers/HttpsIdentifier"; +import { Identifier } from "../../identifiers/Identifier"; +import { MatrixIdentifier } from "../../identifiers/MatrixIdentifier"; +import { TypeCellIdentifier } from "../../identifiers/TypeCellIdentifier"; +import { LocalDoc } from "./DocumentCoordinator"; +import FetchRemote from "./remote/FetchRemote"; -export type SyncManager = lifecycle.IDisposable & { - readonly doc: "loading" | "not-found" | Y.Doc; - get canWrite(): boolean; +// import { MatrixRemote } from "./remote/MatrixRemote"; +import { makeYDocObservable } from "@syncedstore/yjs-reactive-bindings"; +import { SupabaseSessionStore } from "../../app/supabase-auth/SupabaseSessionStore"; +import { SessionStore } from "../local/SessionStore"; +import { Remote } from "./remote/Remote"; +import { TypeCellRemote } from "./remote/TypeCellRemote"; - initialize(): Promise; - - awareness: any; - on: () => void; +type SyncingSyncManager = SyncManager & { + state: { + status: "syncing"; + localDoc: LocalDoc; + }; }; + +export class SyncManager extends lifecycle.Disposable { + private initializeCalled = false; + private disposed = false; + private readonly ydoc: Y.Doc; + + public state: + | { status: "loading" } + | { + status: "syncing"; + localDoc: LocalDoc; + } = { status: "loading" }; + + public get docOrStatus() { + const remoteStatus = this.remote.status; + if (this.state.status === "loading") { + if (remoteStatus === "loaded") { + // throw new Error("not possible"); // TODO: is this safe? + console.error( + "should not be possible, doc status 'loading', but remote 'loaded'" + ); + return "loading"; + } + return remoteStatus; + } + return this.state.localDoc.ydoc; + } + + public get awareness() { + return this.remote.awareness; + } + + /** @internal */ + public indexedDBProvider: IndexeddbPersistence | undefined; + public readonly remote: Remote; + constructor( + public readonly identifier: Identifier, + // private readonly localDoc: LocalDoc | undefined, + private readonly sessionStore: SessionStore + ) { + super(); + // if (localDoc) { + // this.doc = { + // status: "syncing", + // localDoc: localDoc, + // }; + // } else { + // this.doc = { + // status: "loading", + // ydoc: new Y.Doc({ guid: this.identifier.toString() }), + // }; + // } + + this.ydoc = new Y.Doc({ guid: this.identifier.toString() }); + makeYDocObservable(this.ydoc); + makeObservable(this, { + state: observable.ref, + docOrStatus: computed, + }); + + this.remote = this.remoteForIdentifier(identifier); + + const disposeAutorun = autorun(() => { + if (this.remote instanceof TypeCellRemote) { + const unsyncedChanges = this.remote.unsyncedChanges; + if (this.remote.status !== "loaded") { + return; // don't update sync status if remote has not initialized sync yet + } + if (unsyncedChanges === 0) { + if (!this.sessionStore.documentCoordinator) { + throw new Error( + "no documentCoordinator. logged out while syncing?" + ); + } + if (this.state.status === "loading") { + throw new Error("not possible"); + } + this.sessionStore.documentCoordinator.markSynced(this.state.localDoc); + } + } + }); + + this._register({ + dispose: () => { + disposeAutorun(); + }, + }); + this._register({ + dispose: () => { + this.ydoc.destroy(); + }, + }); + this._register(this.remote); + this._register({ + dispose: () => (this.disposed = true), + }); + } + + get canWrite(): boolean { + if ( + this.remote instanceof FetchRemote && + this.state.status === "syncing" && + this.state.localDoc.meta.needs_save_since + ) { + // hacky fix for docs / httpidentifier + return false; + } + return this.remote.canWrite; + } + + private remoteForIdentifier(identifier: Identifier): Remote { + if (identifier instanceof FileIdentifier) { + throw new Error("not implemented anymore"); + // return new FilebridgeRemote(this.ydoc, identifier); + } else if (identifier instanceof GithubIdentifier) { + throw new Error("not implemented anymore"); + // return new GithubRemote(this.ydoc, identifier); + } else if (identifier instanceof HttpsIdentifier) { + return new FetchRemote(this.ydoc, identifier); + } else if (identifier instanceof MatrixIdentifier) { + throw new Error("not implemented anymore"); + // return new MatrixRemote(this.ydoc, identifier); + } else if (identifier instanceof TypeCellIdentifier) { + if (!(this.sessionStore instanceof SupabaseSessionStore)) { + // TODO: should this be possible? + throw new Error( + "can't load from supabase without supabasesessionstore" + ); + } + return new TypeCellRemote(this.ydoc, identifier, this.sessionStore); + } else { + throw new Error("unsupported identifier"); + } + } + + public async startSyncing() { + if (this.state.status !== "syncing") { + throw new Error("not syncing"); + } + if (!this.state.localDoc.meta.exists_at_remote) { + await this.remote.createAndRetry(); + + if (!this.sessionStore.documentCoordinator) { + throw new Error("no documentCoordinator. logged out while syncing?"); + } + this.sessionStore.documentCoordinator.markCreated(this.state.localDoc); + } + this.remote.startSyncing(); + // listen for events + } + + private async loadFromRemote() { + await this.remote.startSyncing(); + await when(() => this.remote.status === "loaded"); + + if (!this.sessionStore.documentCoordinator) { + throw new Error( + "no documentCoordinator. logged out while loadFromRemote?" + ); + } + + if (this.disposed) { + return; + } + + const localDoc = + this.sessionStore.documentCoordinator.createDocumentFromRemote( + this.identifier, + this.ydoc + ); + + runInAction(() => { + this.state = { + status: "syncing", + localDoc, + }; + }); + + // on sync add to store + // listen for events + } + + private async create(forkSource?: Y.Doc) { + if (this.initializeCalled) { + throw new Error("load() called when already initialized"); + } + this.initializeCalled = true; + + if (!this.sessionStore.documentCoordinator) { + throw new Error("no documentCoordinator. logged out while creating?"); + } + + if (forkSource) { + Y.applyUpdateV2(this.ydoc, Y.encodeStateAsUpdateV2(forkSource)); + } + + const doc = await this.sessionStore.documentCoordinator.createDocument( + this.identifier, + this.ydoc + ); + + if (this.disposed) { + return; + } + + runInAction(() => { + this.state = { + status: "syncing", + localDoc: doc, + }; + }); + return this.startSyncing(); + } + + private async load() { + if (this.initializeCalled) { + throw new Error("load() called when already initialized"); + } + this.initializeCalled = true; + if (!this.sessionStore.documentCoordinator) { + throw new Error("logged out while loading"); + } + + if (this.identifier instanceof HttpsIdentifier) { + await this.sessionStore.documentCoordinator.clearIfNotChanged( + this.identifier + ); + } + + const doc = this.sessionStore.documentCoordinator.loadDocument( + this.identifier, + this.ydoc + ); + + if (doc === "not-found") { + // the document did not exist locally + return this.loadFromRemote(); + } else { + // the document was previously loaded (and exists in the local cache) + + // TODO: catch when doc didn't exist locally + await doc.idbProvider.whenSynced; + + runInAction(() => { + this.state = { + status: "syncing", + localDoc: doc, + }; + }); + + // hacky fix for docs / httpidentifier + if (!(this.identifier instanceof HttpsIdentifier)) { + return this.startSyncing(); + } + } + } + + public async clearAndReload() { + if (this.disposed) { + throw new Error("clearAndReload: already disposed"); + } + + if (!this.sessionStore.documentCoordinator) { + throw new Error("logged out while clearAndReload"); + } + await this.sessionStore.documentCoordinator.deleteLocal(this.identifier); + this.dispose(); + + return SyncManager.load(this.identifier, this.sessionStore); + } + + public dispose() { + console.log("SyncManager dispose", this.identifier.toString()); + setTimeout(() => { + this.ydoc.destroy(); + }, 0); + + this.disposed = true; + super.dispose(); + } + + public async waitTillLoaded() { + await when(() => this.state.status === "syncing"); + return this as SyncingSyncManager; + } + + public static create( + identifier: Identifier, + sessionStore: SessionStore, + forkSource?: Y.Doc + ) { + // create locally + // start syncing: + // - periodically "create" when not created + // - sync when created, update values in coordinator + + console.log("SyncManager create", identifier.toString()); + + const manager = new SyncManager(identifier, sessionStore); + + manager.create(forkSource).catch((e) => { + console.error("error in SyncManager.create", e); + }); + + return manager; + } + + public static load(identifier: Identifier, sessionStore: SessionStore) { + // IF not existing + // - load from remote + // - create locally + // - start syncing, update values in coordinator + + // IF existing + // - load from coordinator + // - start syncing, update values in coordinator + + console.log("SyncManager load", identifier.toString()); + const manager = new SyncManager(identifier, sessionStore); + manager.load().catch((e) => { + console.error("error in SyncManager.load", e); + }); + // TODO: don't return synced when idb is still loading + + return manager; + } +} + +/* + +DocConnection: manages cache of documents by identifier +SyncManager: manages syncing of a single document with localcache and remote +Remote: manages syncing with a single remote + +Create: +- DocConnection.create(identifier) +- SyncManager.create(identifier) + -> creates locally + -> creates remote +- Remote.canCreate, Remote.create(identifier) + +Load: +- DocConnection.load(identifier) + + + +- status of syncing (last sync time) +- delete / create offline +- make changes offline and sync later +- fork +- guest copy +- ids and aliases +- login / logout + + + +- User loads @user/document +- Maps to mx://mx.typecell.org/@user/document +- Loads from indexeddb +- Starts syncing with mx://mx.typecell.org/@user/document + +*/ diff --git a/packages/editor/src/store/yjs-sync/YDocSyncManager.ts b/packages/editor/src/store/yjs-sync/YDocSyncManager.ts deleted file mode 100644 index 377117130..000000000 --- a/packages/editor/src/store/yjs-sync/YDocSyncManager.ts +++ /dev/null @@ -1,244 +0,0 @@ -import { MatrixProvider } from "matrix-crdt"; -import { MatrixClient } from "matrix-js-sdk"; -import { createAtom, makeObservable, observable, runInAction } from "mobx"; -import { lifecycle } from "vscode-lib"; -import { IndexeddbPersistence } from "y-indexeddb"; -import * as awarenessProtocol from "y-protocols/awareness"; -import * as Y from "yjs"; -import { getTestFlags } from "../../config/config"; -import { Identifier } from "../../identifiers/Identifier"; -import { MatrixIdentifier } from "../../identifiers/MatrixIdentifier"; -import { existsLocally, getIDBIdentifier, waitForIDBSynced } from "./IDBHelper"; -import { SyncManager } from "./SyncManager"; -/** - * Given an identifier, manages local + remote syncing of a Y.Doc - */ -export class YDocSyncManager - extends lifecycle.Disposable - implements SyncManager -{ - private readonly _ydoc: Y.Doc; - private initializeCalled = false; - private _canWriteAtom = createAtom("_canWrite"); - - public readonly awareness: awarenessProtocol.Awareness; - public readonly idbIdentifier: string; - - public get canWrite() { - this._canWriteAtom.reportObserved(); - if (!this.matrixProvider) { - return true; - } - return this.matrixProvider.canWrite; - } - - /** @internal */ - public matrixProvider: MatrixProvider | undefined; - - /** @internal */ - public webrtcProvider: { awareness: any } | undefined; - - /** @internal */ - public indexedDBProvider: IndexeddbPersistence | undefined; - - /** - * Get the managed "doc". Returns: - * - a Y.Doc encapsulating the loaded doc if available - * - "not-found" if the document doesn't exist locally / remote - * - "loading" if we're still loading the document - * - * (mobx observable) - * - * @type {("loading" | "not-found" | Y.Doc)} - * @memberof DocConnection - */ - public doc: "loading" | "not-found" | Y.Doc = "loading"; - - public constructor( - public readonly identifier: MatrixIdentifier, - private readonly mxClient: MatrixClient, - private readonly userId: string | undefined, - private readonly forkSourceIdentifier?: Identifier - ) { - super(); - this.idbIdentifier = getIDBIdentifier( - this.identifier.toString(), - this.userId - ); - makeObservable(this, { - doc: observable.ref, - }); - - this._ydoc = new Y.Doc({ guid: this.identifier.toString() }); - this.awareness = new awarenessProtocol.Awareness(this._ydoc); - } - - public async initialize() { - try { - if (this.initializeCalled) { - throw new Error("already called initialize() on YDocSyncManager"); - } - this.initializeCalled = true; - await this.initializeNoCatch(); - } catch (e) { - console.error(e); - throw e; - } - } - - private async applyChangesFromAndDeleteSource(idbIdentifier: string) { - const guestIndexedDBProvider = new IndexeddbPersistence( - idbIdentifier, - this._ydoc - ); - await waitForIDBSynced(guestIndexedDBProvider); - await guestIndexedDBProvider.clearData(); - } - - /** - * scenario 1: - * - not signed in (guest) - * - makes changes to @user1/doc, these are saved in guest-@user1/doc - * - signs in as @user2: changes from guest-@user1/doc need to move to u-@user2-@user1/doc - * - * scenario 2: - * - signed in as @user2 - * - makes changes to @user1/doc, these are saved to u-@user2-@user1/doc - * - forks, u-@user2-@user1/doc needs to move to u-@user2-@user2/doc - */ - private async initLocalProviders() { - if (this.indexedDBProvider) { - throw new Error("already has indexedDBProvider"); - } - - this.indexedDBProvider = new IndexeddbPersistence( - this.idbIdentifier, - this._ydoc - ); - - await waitForIDBSynced(this.indexedDBProvider); - - // scenario 1 - if (this.userId) { - const guestIDB = getIDBIdentifier(this.identifier.toString(), undefined); - if (await existsLocally(guestIDB)) { - console.log("copying guest idb"); - await this.applyChangesFromAndDeleteSource(guestIDB); - } - } - - // scenario 2 - if (this.forkSourceIdentifier) { - if (!this.userId) { - throw new Error("unexpected, forkSource but no userId"); - } - const idbId = getIDBIdentifier( - this.forkSourceIdentifier.toString(), - this.userId - ); - if (!existsLocally(idbId)) { - throw new Error("fork source not found"); - } - await this.applyChangesFromAndDeleteSource(idbId); - } - - if (this.webrtcProvider) { - throw new Error("already has webrtcProvider"); - } - runInAction(() => { - this.doc = this._ydoc; - }); - } - - public async deleteLocalChanges() { - if (!this.indexedDBProvider) { - throw new Error("deleteLocalChanges() called without indexedDBProvider"); - } - await this.indexedDBProvider.clearData(); - this.indexedDBProvider.destroy(); - this.indexedDBProvider = undefined; - } - - private async initializeNoCatch() { - // const mxClient = YDocSyncManager.matrixClient; - // if (!mxClient) { - // throw new Error("no matrix client available"); - // } - const alreadyLocal = await existsLocally(this.idbIdentifier); - - if (typeof this.doc !== "string") { - throw new Error("already loaded"); - } - - if (alreadyLocal) { - // For alreadyLocal, - // we await here to first load indexeddb, and then later sync with remote providers - // This way, when we set up MatrixProvider, we also have an initial state - // and can detect whether any local changes need to be synced to the remote (matrix) - await this.initLocalProviders(); - } - - this.matrixProvider = this._register( - new MatrixProvider( - this._ydoc, - this.mxClient, - { - type: "alias", - alias: - "#" + - this.identifier.roomName + - ":" + - this.identifier.uri.authority, - }, - getTestFlags().disableWebRTC ? undefined : this.awareness, - { - enableExperimentalWebrtcSync: !getTestFlags().disableWebRTC, - translator: { - updatesAsRegularMessages: false, - updateEventType: "org.typecell.doc_update", - snapshotEventType: "org.typecell.doc_snapshot", - }, - } - ) - ); - - this.matrixProvider.initialize(); - this._canWriteAtom.reportChanged(); - - this._register( - this.matrixProvider.onCanWriteChanged(() => { - this._canWriteAtom.reportChanged(); - }) - ); - - this._register( - this.matrixProvider.onDocumentAvailable(() => { - if (!this.indexedDBProvider) { - this.initLocalProviders(); - } - }) - ); - - this._register( - this.matrixProvider.onDocumentUnavailable(() => { - // TODO: tombstone? - runInAction(() => { - this.doc = "not-found"; - }); - this.indexedDBProvider?.destroy(); - this.indexedDBProvider = undefined; - this.webrtcProvider = undefined; - }) - ); - } - - public dispose() { - super.dispose(); - this.indexedDBProvider?.destroy(); - this.indexedDBProvider = undefined; - this.webrtcProvider = undefined; - this.matrixProvider = undefined; - } - - public on() {} -} diff --git a/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts b/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts new file mode 100644 index 000000000..b5555b770 --- /dev/null +++ b/packages/editor/src/store/yjs-sync/remote/FetchRemote.ts @@ -0,0 +1,186 @@ +import { makeObservable, observable, runInAction } from "mobx"; +import { path, strings } from "vscode-lib"; + +import { ChildReference, IndexFileReference } from "@typecell-org/shared"; +import _ from "lodash"; +import * as Y from "yjs"; +import { filesToTreeNodes } from "../../../app/documentRenderers/project/directoryNavigation/treeNodeUtil"; +import { HttpsIdentifier } from "../../../identifiers/HttpsIdentifier"; +import { getIdentifierWithAppendedPath } from "../../../identifiers/paths/identifierPathHelpers"; +import { markdownToYDoc } from "../../../integrations/markdown/import"; +import ProjectResource from "../../ProjectResource"; +import { Remote } from "./Remote"; + +type IndexFile = { + title: string; + items: string[]; +}; + +// function isEmptyDoc(doc: Y.Doc) { +// return areDocsEqual(doc, new Y.Doc()); +// } + +// // NOTE: only changes in doc xml fragment are checked +// function areFragmentsEqual(fragment1: Y.XmlFragment, fragment2: Y.XmlFragment) { +// return _.eq( +// (fragment1.toJSON() as string).replaceAll(/block-id=".*"/g, ""), +// (fragment2.toJSON() as string).replaceAll(/block-id=".*"/g, "") +// ); +// } + +// function areDocsEqual(doc1: Y.Doc, doc2: Y.Doc) { +// return areFragmentsEqual( +// doc1.getXmlFragment("doc"), +// doc2.getXmlFragment("doc") +// ); +// } + +export default class FetchRemote extends Remote { + private disposed = false; + protected id = "fetch"; + public canCreate = false; + + public canWrite = true; // always initialize as true until the user starts trying to make changes + + public get awareness() { + return undefined; + } + + public constructor( + _ydoc: Y.Doc, + private readonly identifier: HttpsIdentifier + ) { + super(_ydoc); + makeObservable(this, { + canWrite: observable.ref, + }); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private documentUpdateListener = async (update: any, origin: any) => { + if (origin === this) { + // these are updates that came in from this provider + return; + } + if (origin?.provider) { + // remote update + return; + } + runInAction(() => (this.canWrite = false)); + }; + + public async initialize() { + try { + await this.initializeNoCatch(); + } catch (e) { + console.error(e); + throw e; + } + } + + private async getNewYDocFromDir(indexFile: IndexFile) { + const newDoc = new Y.Doc(); + newDoc.getMap("meta").set("type", "!project"); + newDoc.getMap("meta").set("title", indexFile.title); + const project = new ProjectResource(newDoc, this.identifier); // TODO + + const tree = filesToTreeNodes( + indexFile.items.map((object) => ({ fileName: object })) + ); + + tree.forEach((node) => { + const id = getIdentifierWithAppendedPath(this.identifier, node.fileName); + project.addRef(ChildReference, id, undefined, false); + + if (node.fileName === "README.md") { + project.addRef(IndexFileReference, id, undefined, false); + } + }); + + return newDoc; + } + + private fetchIndex = _.memoize(async (path: string) => { + return (await (await fetch(path)).json()) as IndexFile; + }); + + private async getNewYDocFromFetch() { + if (this.identifier.uri.path.endsWith(".json")) { + const json = await this.fetchIndex(this.identifier.uri.toString(true)); + return this.getNewYDocFromDir(json); + } else if (this.identifier.uri.path.endsWith(".md")) { + const contents = await ( + await fetch(this.identifier.uri.toString(true)) + ).text(); + + return markdownToYDoc( + contents, + decodeURIComponent(path.basename(this.identifier.uri.path)) + ); + } else { + // TODO: this is hacky. We should use json from parent route instead. Revise routing? + + const [root, ...remainders] = strings + .trim(this.identifier.uri.path, "/") + .split("/"); + const index = this.identifier.uri.with({ path: root + "/index.json" }); + + const json = await this.fetchIndex(index.toString()); + + let prefix = remainders.join("/"); // + "/"; + if (prefix) { + prefix = prefix + "/"; + json.title = path.basename(this.identifier.uri.path); + } + let items = json.items.filter((path) => path.startsWith(prefix)); + items = items.map((path) => path.substring(prefix.length)); + if (!items.length) { + return "not-found" as const; + } + json.items = items; + return this.getNewYDocFromDir(json); + } + } + + private async initializeNoCatch() { + try { + const docData = await this.getNewYDocFromFetch(); + if (this.disposed) { + console.warn("already disposed"); + return; + } + if (docData === "not-found") { + runInAction(() => { + this.status = "not-found"; + }); + return; + } + runInAction(() => { + this.status = "loaded"; + const update = Y.encodeStateAsUpdateV2(docData); + + Y.applyUpdateV2(this._ydoc, update, this); + }); + this._ydoc.on("update", this.documentUpdateListener); + this._register({ + dispose: () => { + this._ydoc.off("update", this.documentUpdateListener); + }, + }); + } catch (e) { + console.error(e); + runInAction(() => { + this.status = "loading"; + }); // TODO: error state? + } + } + + public startSyncing(): Promise { + return this.initialize(); + } + + public dispose() { + this.disposed = true; + super.dispose(); + } +} diff --git a/packages/editor/src/store/yjs-sync/GithubSyncManager.ts b/packages/editor/src/store/yjs-sync/remote/GithubRemote.ts.bak similarity index 56% rename from packages/editor/src/store/yjs-sync/GithubSyncManager.ts rename to packages/editor/src/store/yjs-sync/remote/GithubRemote.ts.bak index 60c30067c..814311162 100644 --- a/packages/editor/src/store/yjs-sync/GithubSyncManager.ts +++ b/packages/editor/src/store/yjs-sync/remote/GithubRemote.ts.bak @@ -1,37 +1,43 @@ import { makeObservable, observable, runInAction } from "mobx"; -import { lifecycle } from "vscode-lib"; import * as Y from "yjs"; -import { GithubIdentifier } from "../../identifiers/GithubIdentifier"; -import { getFileOrDirFromGithub } from "../../integrations/github/github"; -import { markdownToYDoc } from "../../integrations/markdown/import"; -import ProjectResource from "../ProjectResource"; -import { SyncManager } from "./SyncManager"; +import { GithubIdentifier } from "../../../identifiers/GithubIdentifier"; -export default class GithubSyncManager - extends lifecycle.Disposable - implements SyncManager -{ - public canWrite: boolean = true; // always initialize as true until the user starts trying to make changes +import { markdownToYDoc } from "../../../integrations/markdown/import"; +import ProjectResource from "../../ProjectResource"; +import { Remote } from "./Remote"; + +export default class GithubRemote extends Remote { + private disposed = false; + protected id: string = "github"; + public canCreate: boolean = false; - public doc: "loading" | "not-found" | Y.Doc = "loading"; + public canWrite: boolean = true; // always initialize as true until the user starts trying to make changes - public readonly awareness: any = undefined; + public get awareness() { + return undefined; + } - public constructor(private identifier: GithubIdentifier) { - super(); + public constructor( + _ydoc: Y.Doc, + private readonly identifier: GithubIdentifier + ) { + super(_ydoc); makeObservable(this, { - doc: observable.ref, canWrite: observable.ref, }); } + public startSyncing(): Promise { + return this.initialize(); + } + private documentUpdateListener = async (update: any, origin: any) => { if (origin === this) { - // these are updates that came in from MatrixProvider + // these are updates that came in from this provider return; } if (origin?.provider) { - // update from peer (e.g.: webrtc / websockets). Peer is responsible for sending to Matrix + // remote update return; } runInAction(() => (this.canWrite = false)); @@ -51,7 +57,7 @@ export default class GithubSyncManager ) { const newDoc = new Y.Doc(); newDoc.getMap("meta").set("type", "!project"); - const project = new ProjectResource(newDoc, this.identifier); + const project = new ProjectResource(newDoc, this.identifier); // TODO tree.forEach((object) => { if (object.type === "blob" && object.path?.endsWith(".md")) { project.files.set(object.path, {}); @@ -79,25 +85,39 @@ export default class GithubSyncManager private async initializeNoCatch() { try { const docData = await this.getNewYDocFromGithub(); + if (this.disposed) { + console.warn("already disposed"); + return; + } + if (docData === "not-found") { - this.doc = "not-found"; + runInAction(() => { + this.status = "not-found"; + }); return; } - this.doc = docData; - this.doc.on("update", this.documentUpdateListener); + runInAction(() => { + this.status = "loaded"; + const update = Y.encodeStateAsUpdateV2(docData); + Y.applyUpdateV2(this._ydoc, update, this); + }); + + this._ydoc.on("update", this.documentUpdateListener); + this._register({ + dispose: () => { + this._ydoc.off("update", this.documentUpdateListener); + }, + }); } catch (e) { console.error(e); - this.doc = "loading"; // TODO: error state? + runInAction(() => { + this.status = "not-found"; // TODO: error state? + }); } } public dispose() { + this.disposed = true; super.dispose(); - if (typeof this.doc !== "string") { - this.doc.off("update", this.documentUpdateListener); - } - this.doc = "loading"; } - - public on() {} } diff --git a/packages/editor/src/store/yjs-sync/remote/Remote.ts b/packages/editor/src/store/yjs-sync/remote/Remote.ts new file mode 100644 index 000000000..51070c497 --- /dev/null +++ b/packages/editor/src/store/yjs-sync/remote/Remote.ts @@ -0,0 +1,96 @@ +import { makeObservable, observable } from "mobx"; +import { async, lifecycle } from "vscode-lib"; + +import { Awareness } from "y-protocols/awareness"; +import * as Y from "yjs"; +export abstract class Remote extends lifecycle.Disposable { + public status: "loading" | "not-found" | "loaded" = "loading"; // TODO: make this a getter + // public replacementDoc: Y.Doc | undefined; + + protected abstract readonly id: string; + // protected readonly pendingOperationsDoc: Y.Doc; + public abstract canCreate: boolean; + public abstract get canWrite(): boolean; + public abstract get awareness(): Awareness | undefined; + + constructor(protected readonly _ydoc: Y.Doc) { + super(); + // this.pendingOperationsDoc = new Y.Doc(); + // should be user scoped + // new IndexeddbPersistence(this.id, this.pendingOperationsDoc); + makeObservable(this, { + status: observable.ref, + // replacementDoc: observable.ref, + }); + } + + public abstract startSyncing(): Promise; + + protected create(): Promise<"already-exists" | "ok" | "error"> { + throw new Error("not implemented"); + } + + public async createAndRetry() { + if (this.status === "loaded") { + throw new Error("already loaded"); + } + + if (!this.canCreate) { + throw new Error("cannot create"); + } + + const cleanup = { + cancel: () => { + // will be overwritten + }, + }; + + this._register({ + dispose: () => cleanup.cancel(), + }); + + // eslint-disable-next-line no-constant-condition + while (true) { + let retryTimeout = 10000; + try { + const ret = await this.create(); + if (ret !== "error") { + break; + } + } catch (e) { + if (e?.toString()?.includes("fake-offline")) { + // hacky, for testing purposes + retryTimeout = 100; + } + console.error("error in remote.create ", e); + } + + const p = async.timeout(retryTimeout); + cleanup.cancel = p.cancel; + await p; + } + } +} +/* +TODO: test, for providers +- do we retrying creating when offline -> online +- do we keep retrying sync when offline -> online +- do we keep retrying load when offline -> online + + +// SyncManager: holds a doc and responsible for loading / creating + syncing to local + +// Remote, responsible for: +// caching sync / create / delete operations that were made offline +// - executing those when back online +// later: periodically updating docs from remote (e.g.: when user is offline) + +// last synced at +// last modified at +// created at (local) +// created at (remote) +// TODO: delete + +// of per remote? +// - last synced at +*/ diff --git a/packages/editor/src/store/yjs-sync/remote/TypeCellRemote.ts b/packages/editor/src/store/yjs-sync/remote/TypeCellRemote.ts new file mode 100644 index 000000000..ee1085c31 --- /dev/null +++ b/packages/editor/src/store/yjs-sync/remote/TypeCellRemote.ts @@ -0,0 +1,222 @@ +import { + HocuspocusProvider, + HocuspocusProviderWebsocket, +} from "@hocuspocus/provider"; +import { + computed, + createAtom, + makeObservable, + observable, + runInAction, +} from "mobx"; +import { hash, uuid } from "vscode-lib"; +import * as awarenessProtocol from "y-protocols/awareness"; +import * as Y from "yjs"; +import { SupabaseSessionStore } from "../../../app/supabase-auth/SupabaseSessionStore"; +import { env } from "../../../config/env"; +import { TypeCellIdentifier } from "../../../identifiers/TypeCellIdentifier"; +import { Remote } from "./Remote"; + +const wsProviders = new Map(); + +function getWSProvider(session: SupabaseSessionStore) { + if (!session.userPrefix) { + throw new Error("no user available on create document"); + } + let wsProvider = wsProviders.get(session.userPrefix); + if (!wsProvider) { + console.log("new ws provider"); + wsProvider = new HocuspocusProviderWebsocket({ + url: env.VITE_TYPECELL_BACKEND_WS_URL, + // WebSocketPolyfill: ws, + onConnect() { + // console.log("connected"); + }, + }); + if (TypeCellRemote.Offline) { + wsProvider.disconnect(); + } + wsProviders.set(session.userPrefix, wsProvider); + } + return wsProvider; +} + +export class TypeCellRemote extends Remote { + protected id = "typecell"; + + private hocuspocusProvider: HocuspocusProvider | undefined; + private _awarenessAtom = createAtom("_awarenessAtom"); + private _canWriteAtom = createAtom("_canWrite"); + private disposed = false; + + public unsyncedChanges = 0; + + // TODO: set to true and run tests + private static _offline = false; + + public static get Offline() { + return this._offline; + } + + public static set Offline(val: boolean) { + if (val) { + wsProviders.forEach((wsProvider) => { + wsProvider?.disconnect(); + }); + } else { + wsProviders.forEach((wsProvider) => { + wsProvider?.connect(); + }); + } + this._offline = val; + } + + constructor( + _ydoc: Y.Doc, + private readonly identifier: TypeCellIdentifier, + private readonly sessionStore: SupabaseSessionStore + ) { + super(_ydoc); + if (!(identifier instanceof TypeCellIdentifier)) { + throw new Error("invalid identifier"); + } + makeObservable(this, { + unsyncedChanges: observable.ref, + canWrite: computed, + }); + } + + public get awareness(): awarenessProtocol.Awareness | undefined { + this._awarenessAtom.reportObserved(); + return this.hocuspocusProvider?.awareness || undefined; + } + + // TODO: "canWrite" isn't a great name, because it's actually "hasNoChanges Or CanWriteAndWaitingForSync". We should probably split "pending messages" and "access" into two separate properties. + public get canWrite() { + console.log( + "canWrite", + this.unsyncedChanges, + this.hocuspocusProvider?.authorizedScope + ); + return ( + this.unsyncedChanges === 0 || + !this.hocuspocusProvider?.authorizedScope || // initializing + this.hocuspocusProvider?.authorizedScope === "read-write" + ); + } + + public get canCreate() { + return true; + } + + public async create() { + const sessionStore = this.sessionStore; + + if (!sessionStore.userId) { + throw new Error("no user available on create document"); + } + + if (!sessionStore.loggedInUserId) { + console.warn("no loggedInUserId available on create document"); + } + + const date = JSON.stringify(new Date()); + const data = Y.encodeStateAsUpdate(this._ydoc); + const doc = { + id: uuid.generateUuid(), + created_at: date, + updated_at: date, + data: "\\x" + hash.toHexString(data.buffer), + nano_id: this.identifier.documentId, + public_access_level: this.identifier.documentId.endsWith("/.inbox") + ? "write" + : "read", // TODO: shouldn't be hardcoded here + user_id: sessionStore.userId, + } as const; + + if (TypeCellRemote.Offline) { + throw new Error("fake-offline"); + } + console.log( + "insert doc", + (await sessionStore.supabase.auth.getSession()).data.session?.user.id, + doc + ); + const ret = await sessionStore.supabase + .from("documents") + .insert(doc) + .select(); + + if (ret.error) { + console.error(ret.error); + return "error"; + } + // TODO: already exists + return "ok"; + } + + public async startSyncing() { + if (this.disposed) { + console.warn("already disposed"); + return; + } + + const user = this.sessionStore.user; + if (typeof user === "string") { + throw new Error("no user"); + } + + const session = (await this.sessionStore.supabase.auth.getSession()).data + .session; + const token = session + ? session.access_token + "$" + session.refresh_token + : "guest"; + + if (this.disposed) { + console.warn("already disposed"); + return; + } + + // console.log("token", token); + const hocuspocusProvider = new HocuspocusProvider({ + name: this.identifier.documentId, + document: this._ydoc, + token, + websocketProvider: getWSProvider(this.sessionStore), + broadcast: false, + + onSynced: () => { + runInAction(() => { + this.unsyncedChanges = hocuspocusProvider.unsyncedChanges; + this.status = "loaded"; + }); + }, + onAuthenticationFailed: (data) => { + runInAction(() => { + console.warn("auth failed", data); + this.status = "not-found"; + }); + }, + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (hocuspocusProvider as any).isRemote = true; + + hocuspocusProvider.on("unsyncedChanges", () => { + runInAction(() => { + this.unsyncedChanges = hocuspocusProvider.unsyncedChanges; + }); + }); + this.hocuspocusProvider = hocuspocusProvider; + + this._register({ + dispose: () => hocuspocusProvider.destroy(), + }); + console.log("start"); + this._awarenessAtom.reportChanged(); + } + + public dispose(): void { + this.disposed = true; + super.dispose(); + } +} diff --git a/packages/editor/src/styles/index.css b/packages/editor/src/styles/index.css index 43642bc6d..3a44c6c11 100644 --- a/packages/editor/src/styles/index.css +++ b/packages/editor/src/styles/index.css @@ -9,6 +9,14 @@ html { box-sizing: border-box; } +[data-is-sidebar-dragging="true"] iframe { + pointer-events: none !important; +} + +[data-resize-button="true"] > div { + display: none; /* disable extra margin around the resize button */ +} + *, *::before, *::after { @@ -55,11 +63,6 @@ body, overflow-y: auto; } -code { - font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", - monospace; -} - h1, h2, h3, @@ -73,8 +76,6 @@ h6 { position: absolute; } - - /* Some generic layout classes */ .row { display: flex; @@ -92,191 +93,13 @@ h6 { background: white; } -.cellList-item { - padding-left: 100px; - /* border:1px solid black; */ - margin: 10px; - position: relative; -} - -.cellList-add-single { - position: absolute; - left: 50%; - top: 50%; -} - -.cellList-add { - color: #ccc; -} - -.cellList-add:hover { - color: black; -} - -.notebookCell-sideIcon { - /* margin-top: 10px; */ - margin-top: 5px; - margin-right: 5px; - z-index: 10; - cursor: pointer; -} - -.notebookCell-content { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; - width: 100%; -} - -.slate-typecell.collapsed .notebookCell-content { - box-shadow: none; -} - -.notebookCell-codeContainer { - position: relative; - padding-left: 10px; - background: #f4f5f7; - width: 100%; /* todo: fix when making window smaller */ - min-height: 40px; /* so toolbar fits */ -} - -.inlineCell, -.inlineCell .output { - display: inline; - padding: 0; -} - -.inlineCell-codeContainer { - position: absolute; - width: 450px; - left: calc(50% - 225px); - top: 15px; - z-index: 1000; -} - -.inlineCell-codeContainer > .code { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; -} - -.inlineCell-codeContainer > .arrow { - display: block; - margin: 0 auto; - margin-bottom: -4px; - color: rgb(235, 236, 240); -} - -.fullCell-codeContainer { - padding-left: 10px; - background: #f4f5f7; - height: 100%; - width: 100%; /* todo: fix when making window smaller */ -} - -.fullCell { - /* position:relative; */ - display: contents; -} - -.fullCell > :first-child { - position: relative; -} - -.outputWrapper { - display: inline-block; -} -.fullCell.inspectingHover > :first-child::before { - /* background: #ccc; */ - content: ""; - width: 100%; - height: 100%; - position: absolute; - background: rgba(187, 222, 251, 0.68); - z-index: 1000; - pointer-events: none; -} - -.output { - /* padding: 10px; */ - /* because it contains inline-block outputWrapper */ - line-height: 0; -} - -.slate-typecell.collapsed .output { - padding: 0; - padding-top: 5px; -} - -.output > * { - line-height: normal; -} - -.draggableWindow { - top: 0; - position: absolute; - z-index: 1000; -} - -.window { - border-radius: 4px; - box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; - background: white; -} - -.windowContent { - overflow: hidden; -} - -.windowTitle { - padding: 4px; - - border-bottom: 1px solid rgb(235, 236, 240); - text-align: center; - /* background: #ffffff; */ - /* background-image: -webkit-linear-gradient(top, rgb(250, 250, 250) 0px, rgb(246, 246, 246) 100%); */ - -webkit-user-select: none; - user-select: none; - cursor: default; - font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Arial, - sans-serif; - font-size: 13px; - letter-spacing: 0px; - color: rgb(100, 100, 100); -} - -/* .field { - transform: - scale(0.75) - rotateY(-30deg) - rotateX(45deg) - translateZ(4.5rem); - transform-origin: 50% 100%; - transform-style: preserve-3d; - box-shadow: 1rem 1rem 2rem rgba(0,0,0,0.25); - transition: 0.6s ease transform; -} -.field:hover { - transform: scale(1); -} -.field::before { - transform: translateZ(4rem); -} -.field::before:hover { - transform: translateZ(0); -} -.field::after { - transform: translateZ(-4rem); -} -.field::after:hover { - transform: translateZ(-1px); -} */ - -.hint::before { +/* .hint::before { display: inline-block; position: absolute; content: attr(data-hint); -} +} */ -.hint, +/* .hint, .placeholder { pointer-events: none; display: inline-block; @@ -288,198 +111,8 @@ h6 { font-style: italic; font-weight: normal; text-decoration: none; -} - -.cellList { - width: 100%; - position: relative; -} -/* styles below based on pluto */ -.cellList { - padding-top: 20px; - padding-bottom: 4rem; - padding-left: 6px; - padding-right: 6px; - align-content: center; - width: 100%; - flex: 1 1 0%; - overflow-y: auto; -} - -.cellList > div { - margin: 0 auto; - max-width: calc(731px); -} - -.cellList-item { - margin: 0; - padding: 0; - display: block; - min-height: calc(25px); - margin-top: 17px; - position: relative; -} - -/* .shoulder > button, */ -.cellList-item > button { - position: absolute; - margin: 0px; - padding: 1px; - opacity: 50%; - border: none; - background: none; - cursor: pointer; - /* color: hsl(204, 86%, 35%); */ - color: black; - font-family: "Segoe UI Emoji", "Roboto Mono", monospace; - font-size: 0.75rem; - z-index: 3; - /* CodeMirror is 2 */ -} - -.shoulder { - position: absolute; - /* top: 0px; */ - /* bottom: 0px; */ - left: -2000px; - width: 2000px; - cursor: move; - display: flex; - flex-direction: row; - justify-content: flex-end; - align-items: flex-start; - /* Add an invisible border around the shoulder, to make it easier to click on. (The are between two cells is divided in two, each half belongs to the closest pluto-cell.) */ - top: calc(0px - 0.5 * 17px); - bottom: calc(0px - 0.5 * 17px); - border-top: calc(0.5 * 17px) solid rgba(0, 0, 0, 0); - border-bottom: calc(0.5 * 17px) solid rgba(0, 0, 0, 0); -} - -.shoulder:hover { - background: rgba(0, 0, 0, 0.05); - background-clip: padding-box; -} - -/* .shoulder > button { - flex: 0 0 auto; - position: sticky; - top: 0px; - margin-top: 4px; - margin-right: 5px; - padding: 0px 1px; } */ -pluto-cell:focus-within > .shoulder > button { - /* we use padding instead of 4px extra margin to move the eye to the left so that the hitbox becomes grows - you want to be able to double click the button */ - padding-right: 4px; -} - -/* pluto-cell.code_folded.inline-output > .shoulder > button { - margin-top: 3px; -} */ - -pluto-cell > button > span, -pluto-input > button > span { - pointer-events: none; -} - -@media screen and (any-pointer: fine) { - .cellList-item > button, - .shoulder > button, - .cellList-item > pluto-runarea { - opacity: 0; - /* to make it feel smooth: */ - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon { - opacity: 0.5; - transition: opacity 0.25s ease-in-out; - } - .cellList-item.hover > button, - .cellList-item.hover > .shoulder > button { - opacity: 0.25; - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon:hover, - .cellList-item > button:hover, - .cellList-item > .shoulder > button:hover { - opacity: 1; - /* to make it feel snappy: */ - transition: opacity 0.05s ease-in-out; - } -} - -@media screen and (any-pointer: coarse) { - .cellList-item > button, - .cellList-item > pluto-runarea { - opacity: 0; - /* to make it feel smooth: */ - transition: opacity 0.25s ease-in-out; - } - .cellList-item .notebookCell-sideIcon { - opacity: 0.5; - } - .cellList-item:focus-within > button, - .cellList-item:focus-within > .shoulder > button { - opacity: 0.25; - } - .cellList-item > button:focus-within, - .cellList-item > .shoulder > button:focus-within { - opacity: 1; - /* to make it feel snappy: */ - transition: opacity 0.05s ease-in-out; - } -} - -.cellList-item > button > span::after, -.shoulder > button > span::after { - display: block; - content: " " !important; - background-size: 17px 17px; - height: 17px; - width: 17px; -} - -.cellList-item > button.add_cell { - left: -12px; -} - -.cellList-item > button.add_cell.before { - margin-top: calc(-19px - 0.5 * (17px - 19px)) !important; -} - -.cellList-item > button.add_cell.after { - bottom: 1px; - margin-bottom: calc(-20px - 0.5 * (17px - 19px)); -} - -.cellList-item > button.add_cell > span::after { - /* background-image: url(https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.0.0/src/svg/add-circle-outline.svg); */ - background-image: url(../assets/add-outline.svg); -} - -.cellList-item .notebookCell-sideIcon { - /* margin-top: 10px; */ - margin-top: 0; - margin-right: 0; - position: absolute; - left: -20px; - top: 5px; - z-index: 10; -} - -.notebookCell.markdown.collapsed .notebookCell-content { - box-shadow: none; -} - -.notebookCell.markdown.collapsed .notebookCell-sideIcon { - visibility: hidden; -} - -.cellList-item.hover .notebookCell.markdown.collapsed .notebookCell-sideIcon { - visibility: visible; -} - /* // https://github.com/react-dnd/react-dnd/issues/832#issuecomment-442071628 // TODO: should only be set when dragging */ diff --git a/packages/editor/src/sw-tc.ts b/packages/editor/src/sw-tc.ts new file mode 100644 index 000000000..b73f807d2 --- /dev/null +++ b/packages/editor/src/sw-tc.ts @@ -0,0 +1,28 @@ +// PWA config based on https://github.com/vite-pwa/vite-plugin-pwa/tree/main/examples/react-router + +import { + cleanupOutdatedCaches, + createHandlerBoundToURL, + precacheAndRoute, +} from "workbox-precaching"; +import { NavigationRoute, registerRoute } from "workbox-routing"; + +declare let self: ServiceWorkerGlobalScope; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +self.addEventListener("message", (event: any) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (event.data && event.data.type === "SKIP_WAITING") self.skipWaiting(); +}); + +// self.__WB_MANIFEST is default injection point + +precacheAndRoute(self.__WB_MANIFEST); + +// clean old assets +cleanupOutdatedCaches(); + +// to allow work offline +registerRoute(new NavigationRoute(createHandlerBoundToURL("index.html"))); diff --git a/packages/editor/src/util/UnreachableCaseError.ts b/packages/editor/src/util/UnreachableCaseError.ts deleted file mode 100644 index 42a445fc1..000000000 --- a/packages/editor/src/util/UnreachableCaseError.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class UnreachableCaseError extends Error { - constructor(val: never) { - super(`Unreachable case: ${val}`); - } -} diff --git a/packages/editor/src/util/browser.ts b/packages/editor/src/util/browser.ts index addea9515..5cab034c4 100644 --- a/packages/editor/src/util/browser.ts +++ b/packages/editor/src/util/browser.ts @@ -19,9 +19,10 @@ if (typeof navigator !== "undefined") { ); result.mac = /Mac/.test(navigator.platform); - let ie = (result.ie = !!(ieUpTo10 || ie11up || ieEdge)); + const ie = (result.ie = !!(ieUpTo10 || ie11up || ieEdge)); result.ie_version = ieUpTo10 - ? (document as any).documentMode || 6 + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (document as any).documentMode || 6 : ie11up ? +ie11up[1] : ieEdge diff --git a/packages/editor/src/util/hash.ts b/packages/editor/src/util/hash.ts deleted file mode 100644 index 2a61488bb..000000000 --- a/packages/editor/src/util/hash.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function hash(str: string) { - var hash = 0; - for (var i = 0; i < str.length; i++) { - var character = str.charCodeAt(i); - hash = (hash << 5) - hash + character; - hash = hash & hash; // Convert to 32bit integer - } - return hash; -} diff --git a/packages/editor/src/util/slug.ts b/packages/editor/src/util/slug.ts index 1dbb5bc38..7a98aebda 100644 --- a/packages/editor/src/util/slug.ts +++ b/packages/editor/src/util/slug.ts @@ -2,8 +2,8 @@ import speakingurl from "speakingurl"; export function slug(str: string) { return speakingurl(str, { - custom: { - "@": "@", // TODO: necesary? - }, + // custom: { + // "@": "@", // TODO: necesary? + // }, }); } diff --git a/packages/editor/src/util/userIds.ts b/packages/editor/src/util/userIds.ts deleted file mode 100644 index 05abfcd18..000000000 --- a/packages/editor/src/util/userIds.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { DEFAULT_HOMESERVER_HOST } from "../config/config"; - -export function getUserFromMatrixId(matrixId: string) { - // @username:hostname:port (port is optional) - const parts = matrixId.match(/^(@[a-z0-9-_]+):([a-z\-.]+(:\d+)?)$/); - if (!parts) { - throw new Error("invalid user id"); - } - const user = parts[1]; // TODO: what to do with host for federation? - if (!user.startsWith("@") || user.length < 2) { - throw new Error("invalid user id"); - } - - return { - localUserId: parts[1], - host: parts[2], - }; -} - -export function friendlyUserId(matrixId: string) { - const parsed = getUserFromMatrixId(matrixId); - if (parsed.host === DEFAULT_HOMESERVER_HOST) { - return parsed.localUserId; - } - return matrixId; -} diff --git a/packages/editor/tests/end-to-end/collaboration/oneWay.spec.ts b/packages/editor/tests/end-to-end/collaboration/oneWay.spec.ts index 24908a243..937e4b215 100644 --- a/packages/editor/tests/end-to-end/collaboration/oneWay.spec.ts +++ b/packages/editor/tests/end-to-end/collaboration/oneWay.spec.ts @@ -1,10 +1,11 @@ import { Page } from "@playwright/test"; import { test } from "../setup/fixtures"; import { + clearAfterTest, createNotebook, selectionSyncs, + setupBeforeTest, testEditSync, - writeEditorSelector, } from "./util"; let pageAlice: Page; @@ -16,6 +17,7 @@ test.setTimeout(120000); test.beforeAll(async ({ aliceContext, bobContext }) => { test.setTimeout(60000); const ret = await createNotebook("oneWay", aliceContext, bobContext); + pageAlice = ret.pageAlice; pageBob = ret.pageBob; }); @@ -27,29 +29,15 @@ test.afterAll(() => { // before each test, Alice clears the content of the first editor and sets it to "helloworld" test.beforeEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "helloworld"); - await pageBob.waitForSelector("text=helloworld", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await clearAfterTest(pageAlice, pageBob); }); // at the end of each test, set text to "done" and wait until both are synced test.afterEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "done"); - await pageBob.waitForSelector("text=done", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await setupBeforeTest(pageAlice, pageBob); }); -test("selection syncs from Alice to Bob", async ({ +test.skip("selection syncs from Alice to Bob", async ({ aliceContext, bobContext, disableWebRTC, @@ -64,7 +52,7 @@ test("selection syncs from Alice to Bob", async ({ // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); }); -test("selection syncs from Bob to Alice", async ({ +test.skip("selection syncs from Bob to Alice", async ({ aliceContext, bobContext, disableWebRTC, @@ -84,18 +72,19 @@ test("changes sync from Alice to Bob", async ({ bobContext, disableWebRTC, }) => { - await testEditSync(pageAlice, pageBob, disableWebRTC ? 5000 : 2000); + await testEditSync(pageAlice, pageBob); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); }); -test("changes don't sync from Bob to Alice", async ({ +// TODO: readd when forking is fixed +test.skip("changes don't sync from Bob to Alice", async ({ aliceContext, bobContext, disableWebRTC, }) => { - await testEditSync(pageBob, pageAlice, disableWebRTC ? 5000 : 2000, false); + await testEditSync(pageAlice, pageBob, false); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); diff --git a/packages/editor/tests/end-to-end/collaboration/twoWay-private.spec.ts b/packages/editor/tests/end-to-end/collaboration/twoWay-private.spec.ts index 2c765001a..6d9201e30 100644 --- a/packages/editor/tests/end-to-end/collaboration/twoWay-private.spec.ts +++ b/packages/editor/tests/end-to-end/collaboration/twoWay-private.spec.ts @@ -1,10 +1,12 @@ -import { Page } from "@playwright/test"; +import { Page, expect } from "@playwright/test"; import { test } from "../setup/fixtures"; import { + clearAfterTest, createNotebook, + emptyParagraphSelector, selectionSyncs, + setupBeforeTest, testEditSync, - writeEditorSelector, } from "./util"; let pageAlice: Page; @@ -23,16 +25,21 @@ test.beforeAll(async ({ aliceContext, bobContext, bobUser }) => { await pageAlice.click('svg:has-text("Options")'); await pageAlice.click("text=Permissions"); - await pageAlice.click("text=Find a person..."); - await pageAlice.fill("#react-select-add-user-input", bobUser.username); + + // await pageAlice.click("text=Find a person..."); + await pageAlice.fill("#react-select-3-input", bobUser.username); // Click #react-select-add-user-option-0 >> text=@bob-zvghe-0:localhost:8888 - await pageAlice.click( - `#react-select-add-user-option-0 >> text=@${bobUser.username}` - ); + await pageAlice.click(`#react-select-3-listbox >> text=@${bobUser.username}`); await pageAlice.click('button:has-text("Add")'); await pageAlice.click('button:has-text("Apply")'); + + // TODO: would be nice to have a way to apply permissions on the fly with hocuspocus + await pageBob.reload(); + await expect( + pageBob.frameLocator("iframe").locator(emptyParagraphSelector) + ).toBeAttached(); }); test.afterAll(() => { @@ -42,31 +49,15 @@ test.afterAll(() => { // before each test, Alice clears the content of the first editor and sets it to "helloworld" test.beforeEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "helloworld"); - - await pageBob.waitForSelector("text=helloworld", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await clearAfterTest(pageAlice, pageBob); }); // at the end of each test, set text to "done" and wait until both are synced test.afterEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "done"); - - await pageBob.waitForSelector("text=done", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await setupBeforeTest(pageAlice, pageBob); }); -test("selection syncs from Alice to Bob", async ({ +test.skip("selection syncs from Alice to Bob", async ({ aliceContext, bobContext, disableWebRTC, @@ -81,7 +72,7 @@ test("selection syncs from Alice to Bob", async ({ // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); }); -test("selection syncs from Bob to Alice", async ({ +test.skip("selection syncs from Bob to Alice", async ({ aliceContext, bobContext, disableWebRTC, @@ -101,7 +92,7 @@ test("changes sync from Alice to Bob", async ({ bobContext, disableWebRTC, }) => { - await testEditSync(pageAlice, pageBob, disableWebRTC ? 5000 : 2000); + await testEditSync(pageAlice, pageBob); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); @@ -112,7 +103,7 @@ test("changes sync from Bob to Alice", async ({ bobContext, disableWebRTC, }) => { - await testEditSync(pageBob, pageAlice, disableWebRTC ? 5000 : 2000); + await testEditSync(pageBob, pageAlice); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); diff --git a/packages/editor/tests/end-to-end/collaboration/twoWay-public.spec.ts b/packages/editor/tests/end-to-end/collaboration/twoWay-public.spec.ts index e206e2928..afcaee9dd 100644 --- a/packages/editor/tests/end-to-end/collaboration/twoWay-public.spec.ts +++ b/packages/editor/tests/end-to-end/collaboration/twoWay-public.spec.ts @@ -1,10 +1,12 @@ -import { Page } from "@playwright/test"; +import { Page, expect } from "@playwright/test"; import { test } from "../setup/fixtures"; import { + clearAfterTest, createNotebook, + emptyParagraphSelector, selectionSyncs, + setupBeforeTest, testEditSync, - writeEditorSelector, } from "./util"; let pageAlice: Page; @@ -31,6 +33,12 @@ test.beforeAll(async ({ aliceContext, bobContext }) => { ); await pageAlice.click('button:has-text("Apply")'); + + // TODO: would be nice to have a way to apply permissions on the fly with hocuspocus + await pageBob.reload(); + await expect( + pageBob.frameLocator("iframe").locator(emptyParagraphSelector) + ).toBeAttached(); }); test.afterAll(() => { @@ -40,29 +48,15 @@ test.afterAll(() => { // before each test, Alice clears the content of the first editor and sets it to "helloworld" test.beforeEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "helloworld"); - await pageBob.waitForSelector("text=helloworld", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await clearAfterTest(pageAlice, pageBob); }); // at the end of each test, set text to "done" and wait until both are synced test.afterEach(async ({ disableWebRTC }) => { - // Click .view-line - await pageAlice.click(".view-line"); - // Press a with modifiers - await pageAlice.press(writeEditorSelector, "Meta+a"); - await pageAlice.fill(writeEditorSelector, "done"); - await pageBob.waitForSelector("text=done", { - timeout: disableWebRTC ? 5000 : 2000, - }); + await setupBeforeTest(pageAlice, pageBob); }); -test("selection syncs from Alice to Bob", async ({ +test.skip("selection syncs from Alice to Bob", async ({ aliceContext, bobContext, disableWebRTC, @@ -77,7 +71,7 @@ test("selection syncs from Alice to Bob", async ({ // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); }); -test("selection syncs from Bob to Alice", async ({ +test.skip("selection syncs from Bob to Alice", async ({ aliceContext, bobContext, disableWebRTC, @@ -97,7 +91,7 @@ test("changes sync from Alice to Bob", async ({ bobContext, disableWebRTC, }) => { - await testEditSync(pageAlice, pageBob, disableWebRTC ? 5000 : 2000); + await testEditSync(pageAlice, pageBob); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); @@ -108,7 +102,7 @@ test("changes sync from Bob to Alice", async ({ bobContext, disableWebRTC, }) => { - await testEditSync(pageBob, pageAlice, disableWebRTC ? 5000 : 2000); + await testEditSync(pageBob, pageAlice); // select content // TODO: consistent username + colors for screenshots // expect(await pageBob.screenshot()).toMatchSnapshot("sync-selection.bob.png"); diff --git a/packages/editor/tests/end-to-end/collaboration/util.ts b/packages/editor/tests/end-to-end/collaboration/util.ts index 67afa7773..2bca7834b 100644 --- a/packages/editor/tests/end-to-end/collaboration/util.ts +++ b/packages/editor/tests/end-to-end/collaboration/util.ts @@ -5,7 +5,8 @@ import { expect } from "../setup/fixtures"; export const writeEditorSelector = 'textarea[aria-roledescription="editor"]'; // We read the editor text contents from this selector -export const readEditorSelector = ".view-lines"; +export const emptyParagraphSelector = 'div[data-content-type="paragraph"]'; +export const monacoSelector = ".view-lines"; export async function createNotebook( title: string, @@ -15,34 +16,46 @@ export async function createNotebook( const pageAlice = await aliceContext.newPage(); await pageAlice.goto("/"); - const profileButton = pageAlice.locator( - "button[data-testid='profile-button']" - ); + // const profileButton = pageAlice.locator( + // "button[data-testid='profile-button']" + // ); - await profileButton.click(); + // await profileButton.click(); - await pageAlice.click("text=New page"); + await pageAlice.click("text=Add a page"); // Fill :nth-match(input[name="title"], 2) - await pageAlice.fill('input[name="title"]', title); + // await pageAlice.fill('input[name="title"]', title); // Click :nth-match(button:has-text("Create"), 2) // await pageAlice.pause(); - await pageAlice.click('button:has-text("Create")'); + // await pageAlice.click('button:has-text("Create")'); + // await pageAlice.pause(); // wait until alice loads - await pageAlice.waitForSelector(readEditorSelector); + const frameAlice = pageAlice.frameLocator("iframe"); + // await pageAlice.pause(); + await frameAlice.locator(emptyParagraphSelector).click(); + await pageAlice.keyboard.type("/code"); + await pageAlice.keyboard.press("Enter"); + // await frameAlice.locator(emptyParagraphSelector).press("Enter"); + + await expect(frameAlice.locator(monacoSelector)).toBeAttached(); const pageBob = await bobContext.newPage(); // debugger; await pageBob.goto(pageAlice.url()); // wait until bob loads - await pageBob.waitForSelector(readEditorSelector); + const frameBob = pageBob.frameLocator("iframe"); + await expect(frameBob.locator(monacoSelector)).toBeAttached(); return { pageAlice, pageBob }; } export async function selectionSyncs(from: Page, to: Page) { - await from.dblclick("text=helloworld"); + const frameFrom = from.frameLocator("iframe"); + const frameTo = to.frameLocator("iframe"); + + await frameFrom.locator("text=helloworld").dblclick(); // const firstLine = await to.waitForSelector("text=helloworld", { // timeout: 2000, @@ -52,11 +65,11 @@ export async function selectionSyncs(from: Page, to: Page) { // state: "visible", // }); - const loc1 = to.locator("text=helloworld"); + const loc1 = frameTo.locator("text=helloworld"); await loc1.waitFor({ state: "visible", timeout: 2000 }); const bbLine = await loc1.boundingBox(); - const loc2 = to.locator(".yRemoteSelection"); + const loc2 = frameTo.locator(".yRemoteSelection"); await loc2.waitFor({ state: "visible", timeout: 200 }); const bbSelection = await loc2.boundingBox(); // const bbLine = await firstLine.boundingBox(); @@ -73,25 +86,55 @@ export async function selectionSyncs(from: Page, to: Page) { expect(bbLine!.y).toBeNear(bbSelection!.y, 2); } -export async function testEditSync( - from: Page, - to: Page, - timeout: number, - shouldSync = true -) { - await from.press(writeEditorSelector, "Meta+a"); - await from.fill(writeEditorSelector, "changedtext"); +export async function testEditSync(from: Page, to: Page, shouldSync = true) { + const frameFrom = from.frameLocator("iframe"); + const frameTo = to.frameLocator("iframe"); - expect(await from.textContent(readEditorSelector)).toBe("changedtext"); + await frameFrom.locator(".view-line").click(); + await from.keyboard.press("Meta+a"); + await from.keyboard.press("Control+a"); + await from.keyboard.type("changedtext"); + + expect(await frameFrom.locator(monacoSelector).textContent()).toBe( + "changedtext" + ); if (shouldSync) { - await to.waitForSelector("text=changedtext", { - timeout, - }); + await expect(frameTo.locator("text=changedtext")).toBeAttached(); expect(from.locator('[data-test="forkAlert"]')).toBeHidden(); } else { - await to.waitForTimeout(timeout); - expect(to.locator("text=changedtext")).toBeHidden(); - await from.waitForSelector('[data-test="forkAlert"]'); + // await to.waitForTimeout(timeout); + await expect(frameTo.locator("text=changedtext")).toBeHidden(); + await expect(from.locator('[data-test="forkAlert"]')).toBeAttached(); } } + +// before each test, Alice clears the content of the first editor and sets it to "helloworld" +export async function setupBeforeTest(pageAlice: Page, pageBob: Page) { + // Click .view-line + const frameAlice = pageAlice.frameLocator("iframe"); + const frameBob = pageBob.frameLocator("iframe"); + + await frameAlice.locator(".view-line").click(); + // Press a with modifiers + await pageAlice.keyboard.press("Meta+a"); + await pageAlice.keyboard.press("Control+a"); + await pageAlice.keyboard.type("helloworld"); + await expect( + frameBob.getByText("helloworld", { exact: true }) + ).toBeAttached(); +} + +// at the end of each test, set text to "done" and wait until both are synced +export async function clearAfterTest(pageAlice: Page, pageBob: Page) { + const frameAlice = pageAlice.frameLocator("iframe"); + const frameBob = pageBob.frameLocator("iframe"); + + // Click .view-line + await frameAlice.locator(".view-line").click(); + // Press a with modifiers + await pageAlice.keyboard.press("Meta+a"); + await pageAlice.keyboard.press("Control+a"); + await pageAlice.keyboard.type("done"); + await expect(frameBob.locator("text=done")).toBeAttached(); +} diff --git a/packages/editor/tests/end-to-end/login/login.spec.ts b/packages/editor/tests/end-to-end/login/login.spec.ts index 8aaaf75e4..b84396006 100644 --- a/packages/editor/tests/end-to-end/login/login.spec.ts +++ b/packages/editor/tests/end-to-end/login/login.spec.ts @@ -1,49 +1,91 @@ +import { DEFAULT_PROVIDER } from "../setup/config"; import { expect, test } from "../setup/fixtures"; -test("Sign in button exists", async ({ page }) => { - await page.goto("/"); - const button = page.locator("header button"); - await expect(button).toHaveText("Sign in"); -}); +if (DEFAULT_PROVIDER === "supabase") { + test("Sign in by email (supabase)", async ({ + page, + aliceUser, + aliceContext, + }) => { + // aliceContext is needed here for registration, + // but we don't use it here since we test a clean browser -test("Sign in by email", async ({ page, aliceUser, aliceContext }) => { - // aliceContext is needed here for registration, - // but we don't use it here since we test a clean browser + // eslint-disable-next-line no-self-assign + aliceContext = aliceContext; - // eslint-disable-next-line no-self-assign - aliceContext = aliceContext; + await page.goto("/"); + const button = page.locator("button", { hasText: "Log in" }); - await page.goto("/"); - const button = page.locator("button", { hasText: "Sign in" }); + await button.click(); - await button.click(); + await page.keyboard.press("Enter"); - // sign in by username instead of email - await page.locator("text=Email address").click(); - await page.waitForTimeout(100); - // await page.keyboard.press("ArrowUp"); - await page.keyboard.press("ArrowUp"); - await page.keyboard.press("Enter"); + // enter username / password + const email = page.locator("input[name=email]"); + const password = page.locator("input[type=password]"); - // enter username / password - const email = page.locator("input[name=username]"); - const password = page.locator("input[type=password]"); + await email.type(aliceUser.username + "@fakeemail.typecell.org"); + await password.type(aliceUser.password); - await email.type(aliceUser.username); - await password.type(aliceUser.password); + const continueButton = page.locator("button[type=submit]", { + hasText: "Sign in", + }); - const continueButton = page.locator("button[type=submit]", { - hasText: "Continue", + await continueButton.click(); + + const profileButton = page.locator("button[data-testid='profile-button']"); + + await expect(profileButton).toBeVisible(); + + await profileButton.click(); + + const userElement = page.locator("text=@" + aliceUser.username); + await expect(userElement).toBeVisible(); }); +} else { + test("Sign in by email (matrix)", async ({ + page, + aliceUser, + aliceContext, + }) => { + // aliceContext is needed here for registration, + // but we don't use it here since we test a clean browser + + // eslint-disable-next-line no-self-assign + aliceContext = aliceContext; + + await page.goto("/"); + const button = page.locator("button", { hasText: "Log in" }); - await continueButton.click(); + await button.click(); - const profileButton = page.locator("button[data-testid='profile-button']"); + // sign in by username instead of email + await page.locator("text=Email address").click(); + await page.waitForTimeout(100); + // await page.keyboard.press("ArrowUp"); + await page.keyboard.press("ArrowUp"); + await page.keyboard.press("Enter"); - await expect(profileButton).toBeVisible(); + // enter username / password + const email = page.locator("input[name=username]"); + const password = page.locator("input[type=password]"); - await profileButton.click(); + await email.type(aliceUser.username); + await password.type(aliceUser.password); - const userElement = page.locator("text=@" + aliceUser.username); - await expect(userElement).toBeVisible(); -}); + const continueButton = page.locator("button[type=submit]", { + hasText: "Continue", + }); + + await continueButton.click(); + + const profileButton = page.locator("button[data-testid='profile-button']"); + + await expect(profileButton).toBeVisible(); + + await profileButton.click(); + + const userElement = page.locator("text=@" + aliceUser.username); + await expect(userElement).toBeVisible(); + }); +} diff --git a/packages/editor/tests/end-to-end/setup/config.ts b/packages/editor/tests/end-to-end/setup/config.ts new file mode 100644 index 000000000..c77e9cc44 --- /dev/null +++ b/packages/editor/tests/end-to-end/setup/config.ts @@ -0,0 +1 @@ +export const DEFAULT_PROVIDER: "matrix" | "supabase" = "supabase"; diff --git a/packages/editor/tests/end-to-end/setup/globalSetup.ts b/packages/editor/tests/end-to-end/setup/globalSetup.ts index a5413da01..264fed5c7 100644 --- a/packages/editor/tests/end-to-end/setup/globalSetup.ts +++ b/packages/editor/tests/end-to-end/setup/globalSetup.ts @@ -1,8 +1,5 @@ import { FullConfig } from "@playwright/test"; -import { ensureMatrixIsRunning } from "../../util/startMatrixServer"; -async function globalSetup(config: FullConfig) { - await ensureMatrixIsRunning(); -} +async function globalSetup(config: FullConfig) {} export default globalSetup; diff --git a/packages/editor/tests/end-to-end/setup/networkRequestFilter.ts b/packages/editor/tests/end-to-end/setup/networkRequestFilter.ts index fb49f2cf8..73b20d263 100644 --- a/packages/editor/tests/end-to-end/setup/networkRequestFilter.ts +++ b/packages/editor/tests/end-to-end/setup/networkRequestFilter.ts @@ -1,9 +1,13 @@ -import { BrowserContext, BrowserContextOptions } from "@playwright/test"; -import { test as base } from "./scriptSetup"; +import { + BrowserContext, + BrowserContextOptions, + Request, +} from "@playwright/test"; import { uri } from "vscode-lib"; +import { test as base } from "./scriptSetup"; export function addFilterToBrowserContext(context: BrowserContext) { - const listener = (request) => { + const listener = (request: Request) => { const host = uri.URI.parse(request.url()).authority; if ( diff --git a/packages/editor/tests/end-to-end/setup/userFixtures.ts b/packages/editor/tests/end-to-end/setup/userFixtures.ts index df7746d18..a051c0695 100644 --- a/packages/editor/tests/end-to-end/setup/userFixtures.ts +++ b/packages/editor/tests/end-to-end/setup/userFixtures.ts @@ -1,4 +1,7 @@ -import { BrowserContext, Page } from "@playwright/test"; +/* eslint-disable no-empty-pattern */ +/* eslint-disable @typescript-eslint/ban-types */ +import { BrowserContext, Page, expect } from "@playwright/test"; +import { DEFAULT_PROVIDER } from "./config"; import { test as base } from "./networkRequestFilter"; const SESSION_ID = Math.random() @@ -28,13 +31,13 @@ export type TestUser = { // const existingStateBobe = tryLoadState("bob.json"); /** - * Register a user via the interface + * Register a user via the interface (Matrix UI) */ -async function registerUser( +async function registerUserMatrix( page: Page, user: { username: string; password: string } ) { - await page.goto(process.env.TYPECELL_BASE_URL + "/register"); + await page.goto("/register"); const field = page.locator("input[name='username']"); await field.type(user.username); const pwField = page.locator("input[name='password']"); @@ -47,7 +50,39 @@ async function registerUser( await registerBtn.click(); // registered + signed in when profile button is visible - await page.waitForSelector("button[data-testid='profile-button']"); + await expect( + page.locator("button[data-testid='profile-button']") + ).toBeAttached(); +} + +/** + * Register a user via the interface (Supabase UI) + */ +async function registerUserSupabase( + page: Page, + user: { username: string; password: string } +) { + await page.goto("/register"); + const field = page.locator("input[name='email']"); + await field.type(user.username + "@fakeemail.typecell.org"); + const pwField = page.locator("input[name='password']"); + await pwField.type(user.password); + + const registerBtn = page.locator("button[type='submit']"); + await registerBtn.click(); + + await expect(page.locator("input[name='username']")).toBeAttached(); + + const usernameField = page.locator("input[name='username']"); + await usernameField.type(user.username); + + const setUsernameBtn = page.locator("button[type='submit']"); + await setUsernameBtn.click(); + + // registered + signed in when profile button is visible + await expect( + page.locator("button[data-testid='profile-button']") + ).toBeAttached(); } // This fixture exposes information (username / password) of alice / bob @@ -58,7 +93,7 @@ export const testWithUsers = base.extend< aliceUser: [ async ({}, use, workerInfo) => { const aliceUser: TestUser = { - username: "alice-" + SESSION_ID + "-" + workerInfo.workerIndex, + username: "alice_" + SESSION_ID + "_" + workerInfo.workerIndex, password: "myPw123ABC@#$", }; @@ -69,7 +104,7 @@ export const testWithUsers = base.extend< bobUser: [ async ({}, use, workerInfo) => { const bobUser: TestUser = { - username: "bob-" + SESSION_ID + "-" + workerInfo.workerIndex, + username: "bob_" + SESSION_ID + "_" + workerInfo.workerIndex, password: "myB0bPw123ABC@#$", }; @@ -91,7 +126,11 @@ export const test = testWithUsers.extend< // if (!existingStateAlice) { const page = await newContext.newPage(); - await registerUser(page, aliceUser); + if (DEFAULT_PROVIDER === "supabase") { + await registerUserSupabase(page, aliceUser); + } else { + await registerUserMatrix(page, aliceUser); + } await page.close(); // fs.writeFileSync( // "alice.json", @@ -107,7 +146,11 @@ export const test = testWithUsers.extend< async ({ browser, bobUser }, use, workerInfo) => { const newContext = await browser.newContext(); const page = await newContext.newPage(); - await registerUser(page, bobUser); + if (DEFAULT_PROVIDER === "supabase") { + await registerUserSupabase(page, bobUser); + } else { + await registerUserMatrix(page, bobUser); + } await page.close(); // Use the account value. diff --git a/packages/editor/tests/util/loginUtil.ts b/packages/editor/tests/util/loginUtil.ts new file mode 100644 index 000000000..cb9011a5e --- /dev/null +++ b/packages/editor/tests/util/loginUtil.ts @@ -0,0 +1,26 @@ +import { getRandomUserData } from "@typecell-org/shared-test"; +import { when } from "mobx"; +import { SupabaseSessionStore } from "../../src/app/supabase-auth/SupabaseSessionStore"; + +export async function loginAsNewRandomUser( + sessionStore: SupabaseSessionStore, + basename: string +) { + const userData = getRandomUserData(basename); + + const { data, error } = await sessionStore.supabase.auth.signUp(userData); + + if (error) { + throw error; + } + + await when(() => !!sessionStore.userId); + + await sessionStore.setUsername(userData.name); + + return { + user: data.user, + session: data.session, + supabase: sessionStore.supabase, + }; +} diff --git a/packages/editor/tests/util/startMatrixServer.ts b/packages/editor/tests/util/startMatrixServer.ts deleted file mode 100644 index 7bd6dd166..000000000 --- a/packages/editor/tests/util/startMatrixServer.ts +++ /dev/null @@ -1,74 +0,0 @@ -import * as cp from "child_process"; -import fetch from "cross-fetch"; - -export const MATRIX_HOME_URL = new URL("http://localhost:8888/_matrix/static/"); - -let matrixStarted = false; - -/** - * Check whether a matrix server is running at MATRIX_HOME_URL - */ -async function hasMatrixStarted() { - try { - await fetch(MATRIX_HOME_URL.toString()); - return true; - } catch (e) { - return false; - } -} - -/** - * Keeps checking every 2 seconds whether Matrix server is running at MATRIX_HOME_URL - */ -async function waitForMatrixStart() { - while (true) { - console.log("Waiting for Matrix to start..."); - if (await hasMatrixStarted()) { - console.log("Matrix has started!"); - return; - } - await new Promise((resolve) => { - setTimeout(resolve, 2000); - }); - } -} - -/** - * Check if Matrix is running at MATRIX_HOME_URL - * - * If not, start it using docker-compuse - * - * Does not start Matrix using docker-compose in CI, because Github Actions - * should take care of starting Matrix separately in CI - */ -async function doEnsureMatrixIsRunning() { - if (!matrixStarted) { - if (await hasMatrixStarted()) { - matrixStarted = true; - } - } - - if ( - !matrixStarted && - (!process.env.CI || process.env.CI === "vscode-jest-tests") // In CI, Matrix should have already started using a Github action - ) { - matrixStarted = true; - console.log("Starting matrix using docker-compose"); - const ret = cp.execSync("docker compose up -d", { - cwd: "../../test-util/server/", - }); - console.log(ret.toString("utf-8")); - } - - await waitForMatrixStart(); -} - -let globalPromise: Promise | undefined; - -// wrap doEnsureMatrixIsRunning to make sure concurrent request only start Matrix once -export async function ensureMatrixIsRunning() { - if (!globalPromise) { - globalPromise = doEnsureMatrixIsRunning(); - } - return globalPromise; -} diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json index 11fdfa948..1a4fb5bff 100644 --- a/packages/editor/tsconfig.json +++ b/packages/editor/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es6", + "target": "ESNext", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, @@ -15,7 +15,28 @@ "isolatedModules": true, "noEmit": true, "jsx": "react-jsx", - "downlevelIteration": true + "downlevelIteration": true, + "composite": true }, - "include": ["src"] + "include": ["src", "tests"], + "references": [ + { + "path": "../shared" + }, + { + "path": "../shared-test" + }, + { + "path": "../util" + }, + { + "path": "../engine" + }, + { + "path": "../parsers" + }, + { + "path": "../frame" + } + ] } diff --git a/packages/editor/vite.config.ts b/packages/editor/vite.config.ts index c4f92795e..d47164516 100644 --- a/packages/editor/vite.config.ts +++ b/packages/editor/vite.config.ts @@ -1,9 +1,10 @@ import react from "@vitejs/plugin-react"; import history from "connect-history-api-fallback"; -import nodePolyfills from "rollup-plugin-polyfill-node"; +import path from "path"; +import { webpackStats } from "rollup-plugin-webpack-stats"; import { ViteDevServer } from "vite"; +import { VitePWA } from "vite-plugin-pwa"; import { defineConfig } from "vitest/config"; - // solves issue that vite dev server doesn't redirect urls with a "." (such as docs/xxx.md) to the SPA fallback. See https://github.com/vitejs/vite/issues/2190 // code from https://github.com/ivesia/vite-plugin-rewrite-all/blob/master/src/index.ts function redirectAll() { @@ -17,15 +18,57 @@ function redirectAll() { }); server.middlewares.use((req, res, next) => { - handler(req as Request, res as Response, next); + handler(req, res, next); }); }; }, }; } +const pwaOptions: Partial = { + // mode: "development", + // base: "/", + includeAssets: ["favicon.svg"], + manifest: { + name: "TypeCell", + short_name: "TypeCell", + theme_color: "#ffffff", + icons: [ + { + src: "pwa-192x192.png", + sizes: "192x192", + type: "image/png", + }, + { + src: "pwa-512x512.png", + sizes: "512x512", + type: "image/png", + }, + { + src: "pwa-512x512.png", + sizes: "512x512", + type: "image/png", + purpose: "any maskable", + }, + ], + }, + devOptions: { + enabled: true, + /* when using generateSW the PWA plugin will switch to classic */ + type: "module", + navigateFallback: "index.html", + }, + filename: "sw-tc.ts", + srcDir: "src", + strategies: "injectManifest", + injectManifest: { + maximumFileSizeToCacheInBytes: 10000000, + globPatterns: ["**/*.{js,css,html,svg,png,ico,gif,woff,woff2}"], + }, +}; + // https://vitejs.dev/config/ -export default defineConfig({ +export default defineConfig((conf) => ({ server: { host: "localhost", }, @@ -34,19 +77,26 @@ export default defineConfig({ // global: "globalThis", // breaks some modules work because of https://github.com/vitejs/vite/issues/6295, done in index.tsx instead // process & buffer are added to global scope in index.host.tsx }, - plugins: [ - react({ - jsxRuntime: "classic", // TODO: would prefer to move to new jsxRuntime, but doesn't seem compatible with atlaskit - }), - redirectAll(), - ], + plugins: [react(), webpackStats(), VitePWA(pwaOptions)], resolve: { - alias: { - buffer: "rollup-plugin-node-polyfills/polyfills/buffer-es6", - process: "rollup-plugin-node-polyfills/polyfills/process-es6", - }, + // alias: { + // buffer: "rollup-plugin-node-polyfills/polyfills/buffer-es6", + // process: "rollup-plugin-node-polyfills/polyfills/process-es6", + // }, + + alias: + conf.command === "build" + ? ({ + // "@typecell-org/frame": path.resolve(__dirname, "../frame/src/"), + } as Record) + : ({ + // load live from sources with live reload working + "@typecell-org/frame": path.resolve(__dirname, "../frame/src/"), + "@typecell-org/util": path.resolve(__dirname, "../util/src/"), + } as Record), }, optimizeDeps: { + exclude: ["monaco-editor"], esbuildOptions: { plugins: [ // NodeGlobalsPolyfillPlugin({ @@ -56,14 +106,25 @@ export default defineConfig({ // NodeModulesPolyfillPlugin(), ], }, - include: ["simple-peer"], // needed for matrix-crdt }, build: { rollupOptions: { + output: { + chunkFileNames: (chunkInfo) => { + if (chunkInfo.name.includes("y-websocket")) { + // because rollup uses the last source of the chunk as file name, we end + // up with a file named "y-websocket.xxx.js" which actually has a lot of node_modules + // (not just y-websocket). Rename to "chunk" + return "assets/chunk-[hash].js"; + } + return "assets/[name].[hash].js"; + }, + }, // Enable rollup polyfills plugin // used during production bundling - plugins: [nodePolyfills()], + plugins: [], }, + sourcemap: true, }, test: { exclude: [ @@ -78,4 +139,4 @@ export default defineConfig({ }, setupFiles: "src/setupTests.ts", }, -}); +})); diff --git a/packages/engine/package.json b/packages/engine/package.json index 9bb9a8fda..ff838b301 100644 --- a/packages/engine/package.json +++ b/packages/engine/package.json @@ -7,7 +7,8 @@ "lodash": "^4.17.21", "mobx": "^6.2.0", "react": "^18.2.0", - "vscode-lib": "^0.1.2" + "vscode-lib": "^0.1.2", + "@typecell-org/shared": "*" }, "devDependencies": { "chai": "^4.3.6", @@ -17,26 +18,29 @@ "@types/lodash": "^4.14.182", "@types/react": "^18.0.25", "rimraf": "^3.0.2", - "typescript": "4.5.5", - "@playwright/test": "^1.18.1", - "playwright-test": "^8.1.1", - "vitest": "^0.24.4", - "jsdom": "^20.0.0", - "@vitest/coverage-c8": "^0.24.4" - }, - "overrides": { - "playwright-core": "1.24.2" + "typescript": "5.0.4", + "@playwright/test": "^1.33.0", + "playwright-test": "^11.0.4", + "vitest": "^0.33.0", + "jsdom": "^22.1.0", + "@vitest/coverage-v8": "^0.33.0" }, "source": "src/index.ts", - "types": "types/index.d.ts", - "main": "dist/index.js", + "types": "types/src/index.d.ts", + "main": "dist/src/index.js", "type": "module", "scripts": { "clean": "rimraf dist && rimraf types", "build": "npm run clean && tsc -p tsconfig.json", "watch": "tsc --watch", "unittest:vitest": "vitest run --coverage", - "unittest:playwright": "playwright-test '**/*.browsertest.ts'", - "test": "npm run unittest:vitest && npm run unittest:playwright" + "unittest:playwright": "playwright-test '**/*.browsertest.ts' --runner mocha", + "test": "npm run unittest:vitest && npm run unittest:playwright", + "lint": "eslint src" + }, + "eslintConfig": { + "extends": [ + "../shared/.eslintrc.cjs" + ] } } diff --git a/packages/engine/playwright.config.ts b/packages/engine/playwright.config.ts index 937f7935f..46649190b 100644 --- a/packages/engine/playwright.config.ts +++ b/packages/engine/playwright.config.ts @@ -15,7 +15,7 @@ const config: PlaywrightTestConfig = { * Maximum time expect() should wait for the condition to be met. * For example in `await expect(locator).toHaveText();` */ - timeout: 5000, + timeout: 10000, }, /* Fail the build on CI if you accidentally left test.only in the source code. */ diff --git a/packages/engine/src/CellEvaluator.ts b/packages/engine/src/CellEvaluator.ts index 9f36c02c0..83d782529 100644 --- a/packages/engine/src/CellEvaluator.ts +++ b/packages/engine/src/CellEvaluator.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { TypeCellContext } from "./context.js"; import { ModuleExecution, runModule } from "./executor.js"; import { @@ -14,7 +15,7 @@ export function assignExecutionExports( typecellContext: TypeCellContext ) { const newExports: any = {}; - for (let propertyName in exports) { + for (const propertyName in exports) { if (propertyName === "default") { // default exports are not on typecellContext.context newExports.default = exports[propertyName]; diff --git a/packages/engine/src/CodeModel.ts b/packages/engine/src/CodeModel.ts deleted file mode 100644 index a48739130..000000000 --- a/packages/engine/src/CodeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -type Event = { - (listener: (e: T) => any): { dispose: () => void }; -}; - -export type CodeModel = { - onWillDispose: Event; - onDidChangeContent: Event; - getValue(): string; - readonly path: string; - readonly language: string; -}; diff --git a/packages/engine/src/Engine.test.ts b/packages/engine/src/ReactiveEngine.test.ts similarity index 85% rename from packages/engine/src/Engine.test.ts rename to packages/engine/src/ReactiveEngine.test.ts index 010a2179c..eb5d2788f 100644 --- a/packages/engine/src/Engine.test.ts +++ b/packages/engine/src/ReactiveEngine.test.ts @@ -1,7 +1,7 @@ +import { CodeModel } from "@typecell-org/shared"; import { describe, expect, it } from "vitest"; import { event } from "vscode-lib"; -import { CodeModel } from "./CodeModel.js"; -import { Engine } from "./Engine.js"; +import { ReactiveEngine } from "./ReactiveEngine.js"; import { buildMockedModel, importResolver, @@ -26,9 +26,9 @@ exports.default = sum;` const getModel2 = () => buildMockedModel("model2", `exports.default = $.sum - 5;`); -describe("engine class", () => { +describe("ReactiveEngine class", () => { it("should execute a single model", async () => { - const engine = new Engine(importResolver); + const engine = new ReactiveEngine(importResolver); engine.registerModel(getModel1()); const { model, output } = await event.Event.toPromise(engine.onOutput); @@ -39,7 +39,7 @@ describe("engine class", () => { }); it("should read exported variables from other models", async () => { - const engine = new Engine(importResolver); + const engine = new ReactiveEngine(importResolver); engine.registerModel(getModel1()); await event.Event.toPromise(engine.onOutput); @@ -51,7 +51,7 @@ describe("engine class", () => { }); it("should re-evaluate code after change", async () => { - const engine = new Engine(importResolver); + const engine = new ReactiveEngine(importResolver); const model1 = getModel1(); engine.registerModel(model1); @@ -72,7 +72,7 @@ describe("engine class", () => { }); it("should re-evaluate other models when global variable changes", async () => { - const engine = new Engine(importResolver); + const engine = new ReactiveEngine(importResolver); // TODO: Expected 4 events. Figure out why model 2 re-evaluates. const eventsPromise = waitTillEvent(engine.onOutput, 5); const model1 = getModel1(); diff --git a/packages/engine/src/Engine.ts b/packages/engine/src/ReactiveEngine.ts similarity index 82% rename from packages/engine/src/Engine.ts rename to packages/engine/src/ReactiveEngine.ts index d8fe7ea06..9a369a27b 100644 --- a/packages/engine/src/Engine.ts +++ b/packages/engine/src/ReactiveEngine.ts @@ -1,24 +1,25 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { CodeModel } from "@typecell-org/shared/src/codeModels/CodeModel.js"; import _ from "lodash"; import { event, lifecycle } from "vscode-lib"; import { createCellEvaluator } from "./CellEvaluator.js"; -import { CodeModel } from "./CodeModel.js"; -import { createContext, TypeCellContext } from "./context.js"; +import { TypeCellContext, createContext } from "./context.js"; export type ResolvedImport = { - module: any; + module: unknown; } & lifecycle.IDisposable; /** - * The engine automatically runs models registered to it. + * The ReactiveEngine automatically runs models registered to it. * The code of the models is passed a context ($) provided by the engine. * This context is how the code of different models can react to each other. * * @export - * @class Engine + * @class ReactiveEngine */ -export class Engine extends lifecycle.Disposable { +export class ReactiveEngine extends lifecycle.Disposable { private disposed = false; - public readonly observableContext = createContext({} as any); + public readonly observableContext = createContext(); private readonly registeredModels = new Set(); private readonly evaluatorCache = new Map< @@ -57,19 +58,19 @@ export class Engine extends lifecycle.Disposable { private resolveImport: ( module: string, forModel: T - ) => Promise, + ) => Promise, private debounceMillis = 100 ) { super(); } - public registerModelProvider(provider: { - onDidCreateCompiledModel: event.Event; - compiledModels: T[]; + public registerModelProvider(compiledModelProvider: { + onDidCreateModel: event.Event; + models: T[]; }) { - provider.compiledModels.forEach((m) => this.registerModel(m)); + compiledModelProvider.models.forEach((m) => this.registerModel(m)); this._register( - provider.onDidCreateCompiledModel((m) => { + compiledModelProvider.onDidCreateModel((m) => { this.registerModel(m); }) ); @@ -96,6 +97,9 @@ export class Engine extends lifecycle.Disposable { this.observableContext, async (moduleName: string) => { const ret = await this.resolveImport(moduleName, model); + if (!ret) { + throw new Error(`Could not resolve import ${moduleName}`); + } this._register(ret); if (this.disposed) { // disposed in the meantime @@ -166,11 +170,12 @@ export class Engine extends lifecycle.Disposable { ) ); } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const evaluator = this.evaluatorCache.get(model)!; if (model.language !== "javascript") { throw new Error("can not evaluate non-javascript code"); } - let code = model.getValue(); + const code = model.getValue(); console.log("evaluating", code); await evaluator.evaluate(code); } diff --git a/packages/engine/src/__snapshots__/Engine.test.ts.snap b/packages/engine/src/__snapshots__/ReactiveEngine.test.ts.snap similarity index 76% rename from packages/engine/src/__snapshots__/Engine.test.ts.snap rename to packages/engine/src/__snapshots__/ReactiveEngine.test.ts.snap index 258d8edca..ada155f69 100644 --- a/packages/engine/src/__snapshots__/Engine.test.ts.snap +++ b/packages/engine/src/__snapshots__/ReactiveEngine.test.ts.snap @@ -1,6 +1,6 @@ -// Vitest Snapshot v1 +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`engine class > should re-evaluate other models when global variable changes 1`] = ` +exports[`ReactiveEngine class > should re-evaluate other models when global variable changes 1`] = ` [ { "output": { @@ -35,7 +35,7 @@ exports[`engine class > should re-evaluate other models when global variable cha ] `; -exports[`engine class should re-evaluate other models when global variable changes 1`] = ` +exports[`ReactiveEngine class should re-evaluate other models when global variable changes 1`] = ` Array [ Object { "output": Object { diff --git a/packages/engine/src/context.ts b/packages/engine/src/context.ts index bfefb2c8c..3e5865cfd 100644 --- a/packages/engine/src/context.ts +++ b/packages/engine/src/context.ts @@ -12,7 +12,8 @@ export type TypeCellContext = { // storage: Storage; }; -export function createContext(storage?: Storage): TypeCellContext { +export function createContext(): TypeCellContext { + // eslint-disable-next-line @typescript-eslint/no-explicit-any const observableContext = observable({ __esModule: true, }); diff --git a/packages/engine/src/executor.ts b/packages/engine/src/executor.ts index a4d310145..a58d6b6a8 100644 --- a/packages/engine/src/executor.ts +++ b/packages/engine/src/executor.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { autorun, runInAction } from "mobx"; import { TypeCellContext } from "./context.js"; import { installHooks } from "./hookDisposables.js"; @@ -20,7 +21,9 @@ async function resolveDependencyArray( return function () { return resolveImport( // cell, + // eslint-disable-next-line prefer-rest-params arguments[0][0] + // eslint-disable-next-line prefer-rest-params ).then(arguments[1], arguments[2]); }; // return new Function("import(arguments[0][0]).then(arguments[1], arguments[2]);"); @@ -135,7 +138,7 @@ export async function runModule( // Running the assignments to `context` in action should be a performance improvement to prevent triggering observers one-by-one wouldLoopOnAutorun = true; runInAction(() => { - for (let propertyName in exports) { + for (const propertyName in exports) { // log.log(cell.id, "exported property:", propertyName, exports[propertyName]); const saveValue = (exported: any) => { @@ -144,7 +147,7 @@ export async function runModule( } }; - let exported = exports[propertyName]; + const exported = exports[propertyName]; if (isView(exported)) { disposeEveryRun.push(autorun(() => saveValue(exported.value))); // } else if (isReactView(exported)) { @@ -183,7 +186,7 @@ export async function runModule( cleanVariablesFromContext.push((newExports: any) => { runInAction(() => { - for (let propertyName in exports) { + for (const propertyName in exports) { if (!(propertyName in newExports)) { // don't clean variables that are already exported, we will just overwrite them later in the runInAction above delete context.context[propertyName]; diff --git a/packages/engine/src/hookDisposables.ts b/packages/engine/src/hookDisposables.ts index 1b24a5235..6d6fa6569 100644 --- a/packages/engine/src/hookDisposables.ts +++ b/packages/engine/src/hookDisposables.ts @@ -1,3 +1,6 @@ +/* eslint-disable prefer-rest-params */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable @typescript-eslint/no-explicit-any */ type FunctionPropertyNames = { [K in keyof T]: T[K] extends Function ? K : never; }[keyof T]; @@ -18,6 +21,7 @@ function installHook>( (obj[method] as any) = function (this: any) { const args = arguments; const ret = (originalFunction as any).apply(this, args); // TODO: fix any? + // eslint-disable-next-line @typescript-eslint/no-this-alias const ctx = this; disposes.push(() => disposeSingle.call(ctx, ret, args)); return ret; diff --git a/packages/engine/src/index.ts b/packages/engine/src/index.ts index 1f2a2810b..908fa5d98 100644 --- a/packages/engine/src/index.ts +++ b/packages/engine/src/index.ts @@ -1,12 +1,11 @@ export * from "./CellEvaluator.js"; -export * from "./CodeModel.js"; +export * from "./ReactiveEngine.js"; export * from "./context.js"; -export * from "./Engine.js"; export * from "./executor.js"; export * as modules from "./modules.js"; export * from "./reactView.js"; +export * from "./resolvers/ImportShimResolver.js"; +export * from "./resolvers/LocalModuleResolver.js"; export * from "./resolvers/cdns/ESMshResolver.js"; export * from "./resolvers/cdns/JSPMResolver.js"; export * from "./resolvers/cdns/SkypackResolver.js"; -export * from "./resolvers/ImportShimResolver.js"; -export * from "./resolvers/LocalModuleResolver.js"; diff --git a/packages/engine/src/mobx/customAnnotation.ts b/packages/engine/src/mobx/customAnnotation.ts index b5fdf328e..c840981c4 100644 --- a/packages/engine/src/mobx/customAnnotation.ts +++ b/packages/engine/src/mobx/customAnnotation.ts @@ -1,8 +1,9 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { $mobx, observable } from "mobx"; import type { Annotation, ObservableObjectAdministration, } from "mobx/dist/internal"; -import { observable, $mobx } from "mobx"; import React from "react"; const defaultAnnotation = (observable({}) as any)[$mobx].defaultAnnotation_; @@ -63,7 +64,7 @@ export function hookDefaultAnnotation() { throw new Error("already hooked"); } hooked = true; - let oldObject = observable.object; + const oldObject = observable.object; observable.object = (props, decorators, options) => { if (!options) { options = { diff --git a/packages/engine/src/modules.ts b/packages/engine/src/modules.ts index 2525ca8d7..8a7506afe 100644 --- a/packages/engine/src/modules.ts +++ b/packages/engine/src/modules.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/ban-types */ import { autorun, computed, observable, untracked } from "mobx"; import { TypeCellContext } from "./context.js"; // import { stored } from "./storage/stored"; @@ -24,7 +25,9 @@ export type Module = { } */ export function getModulesFromWrappedPatchedTypeCellFunction( + // eslint-disable-next-line @typescript-eslint/no-explicit-any caller: () => any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any scope: any ): Module[] { const modules: Module[] = []; @@ -39,6 +42,7 @@ export function getModulesFromWrappedPatchedTypeCellFunction( */ export function getModulesFromPatchedTypeCellCode( code: string, + // eslint-disable-next-line @typescript-eslint/no-explicit-any scope: any ): Module[] { const modules: Module[] = []; @@ -62,7 +66,8 @@ function createDefine(modules: Module[]) { const dependencyArray: string[] = typeof moduleNameOrDependencyArray === "string" ? dependencyArrayOrFactoryFunction - : (moduleNameOrDependencyArray as any); + : // eslint-disable-next-line @typescript-eslint/no-explicit-any + (moduleNameOrDependencyArray as any); const func = factoryFunction || (dependencyArrayOrFactoryFunction as Function); @@ -74,7 +79,7 @@ function createDefine(modules: Module[]) { }; } -export function createExecutionScope(context: TypeCellContext) { +export function createExecutionScope(context: TypeCellContext) { const scope = { autorun, $: context.context, @@ -89,6 +94,7 @@ export function createExecutionScope(context: TypeCellContext) { return scope; } +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function getPatchedTypeCellCode(compiledCode: string, scope: any) { // Checks if define([], function) like code is already present if (!compiledCode.match(/(define\((".*", )?\[.*\], )function/gm)) { @@ -100,7 +106,7 @@ export function getPatchedTypeCellCode(compiledCode: string, scope: any) { throw new Error("invalid key on scope!"); } - let variableImportCode = Object.keys(scope) + const variableImportCode = Object.keys(scope) .map((key) => `let ${key} = this.${key};`) .join("\n"); diff --git a/packages/engine/src/reactView.ts b/packages/engine/src/reactView.ts index 1413cfb01..db1139a62 100644 --- a/packages/engine/src/reactView.ts +++ b/packages/engine/src/reactView.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { IObservableValue } from "mobx"; import * as React from "react"; diff --git a/packages/engine/src/resolvers/ImportShimResolver.ts b/packages/engine/src/resolvers/ImportShimResolver.ts index dabdbb079..1b377e315 100644 --- a/packages/engine/src/resolvers/ImportShimResolver.ts +++ b/packages/engine/src/resolvers/ImportShimResolver.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import _ from "lodash"; import { ExternalModuleResolver } from "./ExternalModuleResolver.js"; import { LocalModuleResolver } from "./LocalModuleResolver.js"; @@ -38,7 +39,9 @@ export class ImportShimResolver { if (local) { return { module: local, - dispose: () => {}, + dispose: () => { + // noop + }, }; } @@ -50,7 +53,7 @@ export class ImportShimResolver { This is decoded again in onImportShimResolve below */ - for (let resolver of this.resolvers) { + for (const resolver of this.resolvers) { try { const module = await this.importShim( "use$" + resolver.name + "$" + moduleName @@ -58,7 +61,9 @@ export class ImportShimResolver { console.log("loaded module", moduleName, "using", resolver.name); return { module, - dispose: () => {}, + dispose: () => { + //do nothing + }, }; } catch (e) { console.error("failed loading module", resolver.name, e); @@ -94,7 +99,7 @@ export class ImportShimResolver { // Try the registered resolvers if (defaultURL) { - for (let resolver of this.resolvers) { + for (const resolver of this.resolvers) { // Does the URL we're trying to load match with the resolver? const parsedModule = await resolver.getModuleInfoFromURL(defaultURL); if (parsedModule) { @@ -208,6 +213,7 @@ export class ImportShimResolver { if (parts.length !== 3) { throw new Error("expected resolver name in import" + id); } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion resolver = this.resolvers.find((r) => r.name === parts[1])!; id = parts[2]; } else { diff --git a/packages/engine/src/resolvers/LocalModuleResolver.ts b/packages/engine/src/resolvers/LocalModuleResolver.ts index 47c0bc082..bdd769249 100644 --- a/packages/engine/src/resolvers/LocalModuleResolver.ts +++ b/packages/engine/src/resolvers/LocalModuleResolver.ts @@ -3,6 +3,7 @@ export class LocalModuleResolver { public readonly getModule: ( moduleName: string, mode?: string + // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => Promise ) {} // public abstract getModule(moduleName: string, mode?: string): Promise; diff --git a/packages/engine/src/resolvers/cdns/ESMshResolver.ts b/packages/engine/src/resolvers/cdns/ESMshResolver.ts index df9def539..8392e03c6 100644 --- a/packages/engine/src/resolvers/cdns/ESMshResolver.ts +++ b/packages/engine/src/resolvers/cdns/ESMshResolver.ts @@ -9,13 +9,13 @@ export class ESMshResolver extends ExternalModuleResolver { const prefix = "https://esm.sh/"; if (url.startsWith(prefix)) { url = url.substring(prefix.length - 1); - let mode: string | undefined; - let library = url.match(/^\/(v\d+|stable)\/[^\/]+\.js$/); + + const library = url.match(/^\/(v\d+|stable)\/[^/]+\.js$/); if (library) { return undefined; } - let matches = url.match( + const matches = url.match( /^\/(v\d+|stable)\/(.*)@[.\d]+(-[-a-z\d.]+)?\/(.*)$/ ); if (!matches || !matches[2]) { @@ -24,7 +24,7 @@ export class ESMshResolver extends ExternalModuleResolver { const matchedModuleName = matches[2]; // mode is necessary for jsx-runtime, e.g.: @yousef/use-p2 - mode = matches[4]; + const mode = matches[4]; return { module: matchedModuleName, diff --git a/packages/engine/src/resolvers/cdns/JSPMResolver.ts b/packages/engine/src/resolvers/cdns/JSPMResolver.ts index 104436228..b7b664d23 100644 --- a/packages/engine/src/resolvers/cdns/JSPMResolver.ts +++ b/packages/engine/src/resolvers/cdns/JSPMResolver.ts @@ -9,19 +9,19 @@ export class JSPMResolver extends ExternalModuleResolver { const prefix = "https://jspm.dev/"; if (url.startsWith(prefix)) { url = url.substring(prefix.length - 1); - let mode: string | undefined; - let matches = url.match(/^\/npm:(.*)$/); + // let mode: string | undefined; + const matches = url.match(/^\/npm:(.*)$/); if (!matches || !matches[1]) { throw new Error("couldn't match url"); } const matchedModuleName = matches[1]; // mode is necessary for jsx-runtime, e.g.: @yousef/use-p2 - mode = undefined; //matches[3]; + // mode = undefined; //matches[3]; return { module: matchedModuleName, - mode, + mode: undefined, }; } return undefined; diff --git a/packages/engine/src/resolvers/cdns/SkypackResolver.ts b/packages/engine/src/resolvers/cdns/SkypackResolver.ts index c50100e74..5432a9cb4 100644 --- a/packages/engine/src/resolvers/cdns/SkypackResolver.ts +++ b/packages/engine/src/resolvers/cdns/SkypackResolver.ts @@ -10,15 +10,15 @@ export class SkypackResolver extends ExternalModuleResolver { const prefix = "https://cdn.skypack.dev/"; if (url.startsWith(prefix)) { url = url.substring(prefix.length - 1); - let mode: string | undefined; - let matches = url.match(/^\/(new|-)\/(.+)@v[\d.]+[-\/].*mode=(.*)$/); + + const matches = url.match(/^\/(new|-)\/(.+)@v[\d.]+[-/].*mode=(.*)$/); if (!matches || !matches[2]) { throw new Error("couldn't match url"); } const matchedModuleName = matches[2]; // mode is necessary for jsx-runtime, e.g.: @yousef/use-p2 - mode = matches[3]; + const mode = matches[3]; return { module: matchedModuleName, diff --git a/packages/engine/src/resolvers/imports.browsertest.ts b/packages/engine/src/resolvers/imports.browsertest.ts index 9641674e8..4e37c8b65 100644 --- a/packages/engine/src/resolvers/imports.browsertest.ts +++ b/packages/engine/src/resolvers/imports.browsertest.ts @@ -11,7 +11,7 @@ const localResolver = new LocalModuleResolver(async (moduleName) => { return undefined; }); -const resolvers: any[] = [new SkypackResolver()]; +const resolvers = [new SkypackResolver()]; const resolver = new ImportShimResolver(resolvers, localResolver); describe("import tests", () => { diff --git a/packages/engine/src/tests/util/CodeModelMock.ts b/packages/engine/src/tests/util/CodeModelMock.ts index 7d4127aaa..fa65a0862 100644 --- a/packages/engine/src/tests/util/CodeModelMock.ts +++ b/packages/engine/src/tests/util/CodeModelMock.ts @@ -1,12 +1,14 @@ -import { event } from "vscode-lib"; -import { CodeModel } from "../../CodeModel.js"; +import { CodeModel } from "@typecell-org/shared"; +import { event, uri } from "vscode-lib"; export class CodeModelMock implements CodeModel { public contentChangeEmitter = new event.Emitter(); public onWillDispose() { return { - dispose: () => {}, + dispose: () => { + // Do nothing + }, }; } public onDidChangeContent = this.contentChangeEmitter.event; @@ -17,6 +19,10 @@ export class CodeModelMock implements CodeModel { public code: string ) {} + public get uri() { + return uri.URI.parse("file:///" + this.path); + } + public getValue(): string { return this.code; } diff --git a/packages/engine/src/tests/util/helpers.ts b/packages/engine/src/tests/util/helpers.ts index bf37e8661..3fe5fb9ae 100644 --- a/packages/engine/src/tests/util/helpers.ts +++ b/packages/engine/src/tests/util/helpers.ts @@ -1,5 +1,5 @@ -import { CodeModel } from "../../CodeModel.js"; -import { ResolvedImport } from "../../Engine.js"; +import { CodeModel } from "@typecell-org/shared"; +import { ResolvedImport } from "../../ReactiveEngine.js"; import { CodeModelMock } from "./CodeModelMock.js"; export function waitTillEvent( @@ -28,7 +28,9 @@ export async function importResolver( module: { default: {}, }, - dispose: () => {}, + dispose: () => { + // Do nothing + }, }; }; diff --git a/packages/engine/src/view.ts b/packages/engine/src/view.ts index 06e3ceb77..eda82a8a8 100644 --- a/packages/engine/src/view.ts +++ b/packages/engine/src/view.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { autorun, observable } from "mobx"; export type View = any; diff --git a/packages/engine/tsconfig.json b/packages/engine/tsconfig.json index d9c10dd39..b72999b0a 100644 --- a/packages/engine/tsconfig.json +++ b/packages/engine/tsconfig.json @@ -18,7 +18,8 @@ "declarationDir": "types", "sourceMap": true, "downlevelIteration": true, - "outDir": "dist" + "outDir": "dist", + "composite": true }, "include": ["src"] } diff --git a/packages/frame/package.json b/packages/frame/package.json new file mode 100644 index 000000000..748bbf97a --- /dev/null +++ b/packages/frame/package.json @@ -0,0 +1,81 @@ +{ + "name": "@typecell-org/frame", + "version": "0.0.3", + "private": true, + "dependencies": { + "@blocknote/core": "^0.9.2", + "@blocknote/react": "^0.9.2", + "@typecell-org/util": "^0.0.3", + "@typecell-org/shared": "^0.0.3", + "@typecell-org/engine": "^0.0.3", + "@tiptap/core": "^2.0.4", + "@tiptap/react": "^2.0.4", + "@floating-ui/react": "^0.25.1", + "@syncedstore/yjs-reactive-bindings": "^0.5.1", + "localforage":"^1.10.0", + "lz-string": "^1.4.4", + "markdown-it": "^12.0.2", + "monaco-editor": "^0.35.0", + "mobx": "^6.2.0", + "mobx-react-lite": "^3.2.0", + "prosemirror-model": "^1.19.3", + "prosemirror-view": "^1.31.7", + "prosemirror-state": "^1.4.3", + "prosemirror-keymap": "^1.2.2", + "penpal": "^6.1.0", + "prettier": "^3.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-icons": "^4.6.0", + "react-inspector": "^6.0.1", + "typescript": "5.0.4", + "vscode-lib": "^0.1.2", + "y-protocols": "^1.0.5", + "y-websocket": "^1.5.0", + "yjs": "^13.6.4" + }, + "devDependencies": { + "cross-fetch": "^4.0.0", + "typescript": "5.0.4", + "@playwright/test": "^1.33.0", + "playwright-test": "^11.0.4", + "vitest": "^0.33.0", + "jsdom": "^22.1.0", + "@vitest/coverage-v8": "^0.33.0", + "@vitejs/plugin-react": "^4.0.0", + "@types/markdown-it": "^10.0.3", + "@types/prettier": "^3.0.0", + "chai": "^4.3.7" + }, + "type": "module", + "source": "src/index.ts", + "types": "./types/src/index.d.ts", + "main": "./dist/typecell-frame.umd.cjs", + "module": "./dist/typecell-frame.js", + "exports": { + ".": { + "types": "./types/src/index.d.ts", + "import": "./dist/typecell-frame.js", + "require": "./dist/typecell-frame.umd.cjs" + }, + "./style.css": { + "import": "./dist/style.css", + "require": "./dist/style.css" + } + }, + "scripts": { + "clean": "rimraf dist && rimraf types", + "build": "npm run clean && tsc -p tsconfig.json && vite build", + "build:react": "vite build", + "watch": "tsc --watch", + "unittest:vitest": "vitest run --coverage", + "unittest:playwright": "playwright-test '**/*.browsertest.ts' --runner mocha", + "test": "npm run unittest:vitest && npm run unittest:playwright", + "lint": "eslint src" + }, + "eslintConfig": { + "extends": [ + "../shared/.eslintrc.cjs" + ] + } +} diff --git a/packages/frame/src/@types/env.d.ts b/packages/frame/src/@types/env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/packages/frame/src/@types/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/frame/src/Frame.module.css b/packages/frame/src/Frame.module.css new file mode 100644 index 000000000..0346b81ae --- /dev/null +++ b/packages/frame/src/Frame.module.css @@ -0,0 +1,10 @@ +.editor { + padding: 0 calc((100% - 731px) / 2); + height: 100%; + background: transparent !important; +} + +.container, +.container > div { + height: 100%; +} diff --git a/packages/frame/src/Frame.tsx b/packages/frame/src/Frame.tsx new file mode 100644 index 000000000..17c68f814 --- /dev/null +++ b/packages/frame/src/Frame.tsx @@ -0,0 +1,308 @@ +import { observer } from "mobx-react-lite"; +import React, { useEffect, useMemo, useRef } from "react"; +// import LocalExecutionHost from "../../../runtime/executor/executionHosts/local/LocalExecutionHost" +import { + BlockNoteEditor, + DefaultBlockSchema, + PartialBlock, + defaultBlockSchema, +} from "@blocknote/core"; +import "@blocknote/core/style.css"; +import { + BlockNoteView, + getDefaultReactSlashMenuItems, + useBlockNote, +} from "@blocknote/react"; +import * as mobx from "mobx"; +import ReactDOM from "react-dom"; +import * as Y from "yjs"; +import { MonacoBlockContent } from "./MonacoBlockContent"; +import { RichTextContext } from "./RichTextContext"; +import SourceModelCompiler from "./runtime/compiler/SourceModelCompiler"; +import { MonacoContext } from "./runtime/editor/MonacoContext"; +import { ExecutionHost } from "./runtime/executor/executionHosts/ExecutionHost"; +import LocalExecutionHost from "./runtime/executor/executionHosts/local/LocalExecutionHost"; + +import { enableMobxBindings } from "@syncedstore/yjs-reactive-bindings"; +import { ReactiveEngine } from "@typecell-org/engine"; +import { + BasicCodeModel, + HostBridgeMethods, + IframeBridgeMethods, + ModelReceiver, +} from "@typecell-org/shared"; +import { useResource } from "@typecell-org/util"; +import * as monaco from "monaco-editor"; +import { AsyncMethodReturns, connectToParent } from "penpal"; +import { WebsocketProvider } from "y-websocket"; +import styles from "./Frame.module.css"; + +import { setMonacoDefaults } from "./runtime/editor"; + +import { MonacoColorManager } from "./MonacoColorManager"; +import monacoStyles from "./MonacoSelection.module.css"; +import { setupTypecellHelperTypeResolver } from "./runtime/editor/languages/typescript/TypeCellHelperTypeResolver"; +import { setupTypecellModuleTypeResolver } from "./runtime/editor/languages/typescript/TypeCellModuleTypeResolver"; +import { setupNpmTypeResolver } from "./runtime/editor/languages/typescript/npmTypeResolver"; +import { Resolver } from "./runtime/executor/resolver/resolver"; + +enableMobxBindings(mobx); + +window.React = React; +window.ReactDOM = ReactDOM; + +setMonacoDefaults(monaco); +setupTypecellHelperTypeResolver(monaco); +setupTypecellModuleTypeResolver(monaco); +setupNpmTypeResolver(monaco); + +class FakeProvider { + constructor(public readonly awareness: unknown) {} +} + +function insertOrUpdateBlock( + editor: BlockNoteEditor, + block: PartialBlock +) { + const currentBlock = editor.getTextCursorPosition().block; + + if ( + (currentBlock.content.length === 1 && + currentBlock.content[0].type === "text" && + currentBlock.content[0].text === "/") || + currentBlock.content.length === 0 + ) { + editor.updateBlock(currentBlock, block); + } else { + editor.insertBlocks([block], currentBlock, "after"); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + editor.setTextCursorPosition(editor.getTextCursorPosition().nextBlock!); + } +} + +type Props = { + documentIdString: string; + roomName: string; + userName: string; + userColor: string; +}; + +export const Frame: React.FC = observer((props) => { + const modelReceivers = useMemo(() => new Map(), []); + const connectionMethods = useRef>(); + + useEffect(() => { + const methods: IframeBridgeMethods = { + updateModels: async ( + bridgeId: string, + models: { + modelId: string; + model: { value: string; language: string }; + }[] + ) => { + for (const model of models) { + await methods.updateModel(bridgeId, model.modelId, model.model); + } + }, + updateModel: async ( + bridgeId: string, + modelId: string, + model: { value: string; language: string } + ) => { + console.log("register model", modelId); + const modelReceiver = modelReceivers.get(bridgeId); + if (modelReceiver) { + modelReceiver.updateModel(modelId, model); + } else { + throw new Error("unknown bridgeId"); + } + }, + + deleteModel: async (bridgeId: string, modelId: string) => { + const modelReceiver = modelReceivers.get(bridgeId); + if (modelReceiver) { + modelReceiver.deleteModel(modelId); + } else { + throw new Error("unknown bridgeId"); + } + }, + ping: function (): Promise<"pong"> { + throw new Error("Function not implemented."); + }, + }; + const connection = connectToParent({ + // Methods child is exposing to parent + methods, + }); + connection.promise.then((parent) => { + connectionMethods.current = parent; + }); + }, [modelReceivers]); + + const document = useResource(() => { + const ydoc = new Y.Doc(); + + // ydoc.on("update", () => { + // console.log("frame ydoc", ydoc.toJSON()); + // }); + const provider = new WebsocketProvider("", props.roomName, ydoc, { + connect: false, + }); + const colorManager = new MonacoColorManager( + provider.awareness, + props.userName, + props.userColor, + monacoStyles.yRemoteSelectionHead, + monacoStyles.yRemoteSelection + ); + provider.connectBc(); + + return [ + { + provider, + awareness: provider.awareness, + ydoc, + }, + () => { + provider.destroy(); + colorManager.dispose(); + }, + ]; + }, []); + + const tools = useResource( + // "compilers", + () => { + const newCompiler = new SourceModelCompiler(monaco); + const resolver = new Resolver(async (moduleName) => { + // How to resolve typecell modules (i.e.: `import * as nb from "!dALYTUW8TXxsw"`) + const subcompiler = new SourceModelCompiler(monaco); + + const modelReceiver = new ModelReceiver(); + // TODO: what if we have multiple usage of the same module? + modelReceivers.set("modules/" + moduleName, modelReceiver); + + modelReceiver.onDidCreateModel((model) => { + subcompiler.registerModel(model); + }); + + const fullIdentifier = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + await connectionMethods.current!.registerTypeCellModuleCompiler( + moduleName + ); + + // register an alias for the module so that types resolve + // (e.g.: from "!dALYTUW8TXxsw" to "!typecell:typecell.org/dALYTUW8TXxsw") + if ("!" + fullIdentifier !== moduleName) { + monaco.languages.typescript.typescriptDefaults.addExtraLib( + `export * from "!${fullIdentifier}";`, + `file:///node_modules/@types/${moduleName}/index.d.ts` + ); + } + + // TODO: dispose modelReceiver + return subcompiler; + }); + const newEngine = new ReactiveEngine( + resolver.resolveImport + ); + + const newExecutionHost: ExecutionHost = new LocalExecutionHost( + props.documentIdString, + newCompiler, + monaco, + newEngine + ); + return [ + { newCompiler, newExecutionHost }, + () => { + newCompiler.dispose(); + }, + ]; + }, + [props.documentIdString, monaco] + ); + + // useEffect(() => { + // const t = tools; + // if (!t) { + // return; + // } + // return () => { + // t.newCompiler.dispose(); + // t.newExecutionHost.dispose(); + // }; + // }, [tools]); + + // useEffect(() => { + // // make sure color info is broadcast, and color info from other users are reflected in monaco editor styles + // if (document.awareness) { + // const colorManager = new MonacoColorManager( + // document.awareness, + // props.userName, + // props.userColor + // ); + // return () => { + // colorManager.dispose(); + // }; + // } + // }, [document.awareness, props.userColor, props.userName]); + + const editor = useBlockNote({ + domAttributes: { + editor: { + class: styles.editor, + "data-test": "editor", + }, + }, + blockSchema: { + ...defaultBlockSchema, + codeblock: { + propSchema: { + language: { + type: "string", + default: "typescript", + }, + }, + node: MonacoBlockContent, + }, + }, + slashMenuItems: [ + ...getDefaultReactSlashMenuItems(), + { + name: "Code block", + execute: (editor) => + insertOrUpdateBlock(editor, { + type: "codeblock", + }), + aliases: ["code"], + }, + ], + collaboration: { + provider: new FakeProvider(document.awareness), + user: { + name: props.userName, + color: props.userColor, + }, + fragment: document.ydoc.getXmlFragment("doc"), + }, + }); + + return ( +
+ + + + + +
+ ); +}); + +export default Frame; diff --git a/packages/editor/src/app/documentRenderers/notebook/LanguageSelector.module.css b/packages/frame/src/LanguageSelector.module.css similarity index 98% rename from packages/editor/src/app/documentRenderers/notebook/LanguageSelector.module.css rename to packages/frame/src/LanguageSelector.module.css index 80fd23cd9..2cc4397a6 100644 --- a/packages/editor/src/app/documentRenderers/notebook/LanguageSelector.module.css +++ b/packages/frame/src/LanguageSelector.module.css @@ -23,6 +23,7 @@ box-shadow: 0 4px 8px -2px rgb(9 30 66 / 25%), 0 0 1px rgb(9 30 66 / 31%); /* padding: 2px; */ border-radius: 5px; + z-index: 10000; } .languageOptions > button { diff --git a/packages/frame/src/LanguageSelector.tsx b/packages/frame/src/LanguageSelector.tsx new file mode 100644 index 000000000..3c4e4de7e --- /dev/null +++ b/packages/frame/src/LanguageSelector.tsx @@ -0,0 +1,84 @@ +import { + useClick, + useDismiss, + useFloating, + useInteractions, +} from "@floating-ui/react"; +import React, { useState } from "react"; +import { SiCss3, SiTypescript } from "react-icons/si"; + +import styles from "./LanguageSelector.module.css"; + +type CellLanguage = "typescript" | "css"; + +type Props = { + language: CellLanguage; + onChangeLanguage: (language: CellLanguage) => void; + // onRemove: () => void; +}; + +// TODO: this is rerendered whenever the user types :/ +const LanguageSelector: React.FC = (props) => { + const [isOpen, setIsOpen] = useState(false); + const { refs, floatingStyles, context } = useFloating({ + open: isOpen, + onOpenChange: setIsOpen, + placement: "bottom-end", + }); + + const dismiss = useDismiss(context); + const click = useClick(context); + + const { getReferenceProps, getFloatingProps } = useInteractions([ + click, + dismiss, + ]); + + const languageName = (language: CellLanguage) => { + switch (language) { + case "typescript": + return "TypeScript"; + case "css": + return "CSS"; + } + }; + return ( + <> + + {isOpen && ( +
+ + +
+ )} + + ); +}; + +export default LanguageSelector; diff --git a/packages/frame/src/MonacoBlockContent.tsx b/packages/frame/src/MonacoBlockContent.tsx new file mode 100644 index 000000000..e2174683e --- /dev/null +++ b/packages/frame/src/MonacoBlockContent.tsx @@ -0,0 +1,198 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { BlockNoteEditor, createTipTapBlock } from "@blocknote/core"; +import { mergeAttributes } from "@tiptap/core"; +// import styles from "../../Block.module.css"; + +import { + NodeViewProps, + NodeViewWrapper, + ReactNodeViewRenderer, +} from "@tiptap/react"; +import { keymap } from "prosemirror-keymap"; +import { EditorState, Selection } from "prosemirror-state"; +import { EditorView, NodeView } from "prosemirror-view"; +import { MonacoElement } from "./MonacoElement"; + +function arrowHandler( + dir: "up" | "down" | "left" | "right" | "forward" | "backward" +) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return (state: EditorState, dispatch: any, view: EditorView) => { + if (state.selection.empty && view.endOfTextblock(dir)) { + const side = dir === "left" || dir === "up" ? -1 : 1; + const $head = state.selection.$head; + const nextPos = Selection.near( + state.doc.resolve(side > 0 ? $head.after() : $head.before()), + side + ); + console.log("nextPos", nextPos.$head.parent.type.name); + if (nextPos.$head && nextPos.$head.parent.type.name === "codeblock") { + dispatch(state.tr.setSelection(nextPos)); + return true; + } + } + return false; + }; +} + +const arrowHandlers = keymap({ + ArrowLeft: arrowHandler("left"), + ArrowRight: arrowHandler("right"), + ArrowUp: arrowHandler("up"), + ArrowDown: arrowHandler("down"), +} as any); + +const ComponentWithWrapper = ( + props: NodeViewProps & { + block: any; + htmlAttributes: any; + selectionHack: any; + blockNoteEditor: BlockNoteEditor; + } +) => { + const { htmlAttributes, ...restProps } = props; + return ( + + + + ); +}; + +// TODO: clean up listeners +export const MonacoBlockContent = createTipTapBlock<"codeblock", any>({ + name: "codeblock", + content: "inline*", + editable: true, + selectable: true, + whitespace: "pre", + code: true, + addAttributes() { + return { + language: { + default: "typescript", + parseHTML: (element) => element.getAttribute("data-language"), + renderHTML: (attributes) => { + return { + "data-language": attributes.language, + }; + }, + }, + }; + }, + + parseHTML() { + return [ + { + tag: "code", + priority: 200, + node: "codeblock", + }, + ]; + }, + + renderHTML({ HTMLAttributes }) { + return [ + "code", + mergeAttributes(HTMLAttributes, { + // class: styles.blockContent, + "data-content-type": this.name, + }), + ]; + }, + + addNodeView() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const BlockContent = (props: any) => { + // const Content = blockConfig.render; + + // Add props as HTML attributes in kebab-case with "data-" prefix + const htmlAttributes: Record = {}; + // for (const [attribute, value] of Object.entries(props.node.attrs)) { + // if (attribute in blockConfig.propSchema) { + // htmlAttributes[camelToDataKebab(attribute)] = value; + // } + // } + + // Gets BlockNote editor instance + const editor = this.options.editor; + // Gets position of the node + const pos = + typeof props.getPos === "function" ? props.getPos() : undefined; + // Gets TipTap editor instance + const tipTapEditor = editor._tiptapEditor; + // Gets parent blockContainer node + const blockContainer = tipTapEditor.state.doc.resolve(pos).node(); + // Gets block identifier + const blockIdentifier = blockContainer.attrs.id; + // Get the block + const block = editor.getBlock(blockIdentifier); + + console.log("ComponentWithWrapper"); + return ( + + ); + }; + // console.log("addnodeview"); + return (props) => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + if (!(props.editor as any).contentComponent) { + // same logic as in ReactNodeViewRenderer + return {}; + } + const ret = ReactNodeViewRenderer(BlockContent, { + stopEvent: () => true, + })(props) as NodeView; + // manual hack, because tiptap React nodeviews don't support setSelection + ret.setSelection = (anchor, head) => { + // This doesn't work because the Tiptap react renderer doesn't properly support forwardref + // (ret as any).renderer.ref?.setSelection(anchor, head); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (ret as any).renderer.updateProps({ + selectionHack: { anchor, head }, + }); + }; + + // disable contentdom, because we render the content ourselves in MonacoElement + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (ret as any).contentDOMElement = undefined; + // ret.destroy = () => { + // console.log("destroy element"); + // // (ret as any).renderer.destroy(); + // }; + // This is a hack because tiptap doesn't support innerDeco, and this information is normally dropped + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const oldUpdated = ret.update!.bind(ret); + ret.update = (node, outerDeco, innerDeco) => { + // console.log("update"); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const retAsAny = ret as any; + let decorations = retAsAny.decorations; + if ( + retAsAny.decorations.decorations !== outerDeco || + retAsAny.decorations.innerDecorations !== innerDeco + ) { + // change the format of "decorations" to have both the outerDeco and innerDeco + decorations = { + decorations: outerDeco, + innerDecorations: innerDeco, + }; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return oldUpdated(node, decorations, undefined as any); + }; + return ret; + }; + }, + addProseMirrorPlugins() { + return [arrowHandlers]; + }, +}); diff --git a/packages/editor/src/app/documentRenderers/notebook/MonacoColorManager.ts b/packages/frame/src/MonacoColorManager.ts similarity index 67% rename from packages/editor/src/app/documentRenderers/notebook/MonacoColorManager.ts rename to packages/frame/src/MonacoColorManager.ts index 0e0fca9d8..37aa13d7d 100644 --- a/packages/editor/src/app/documentRenderers/notebook/MonacoColorManager.ts +++ b/packages/frame/src/MonacoColorManager.ts @@ -6,19 +6,25 @@ type User = { color: string; }; -function generateUserAwarenessCSS(clientId: number, user: User) { - const selectionClassName = `yRemoteSelection-${clientId}`; - const headClassName = `yRemoteSelectionHead-${clientId}`; +function generateUserAwarenessCSS( + clientId: number, + user: User, + headSelectionClassName: string, + selectionClassName: string +) { + const selectionClassNameForClient = selectionClassName + `-${clientId}`; + const headSelectionClassNameForClient = + headSelectionClassName + `-${clientId}`; const css = - `.${selectionClassName}, .${selectionClassName}::after, .${selectionClassName}::before, - .${headClassName}, .${headClassName}::after, .${headClassName}::before + `.${selectionClassNameForClient}, .${selectionClassNameForClient}::after, .${selectionClassNameForClient}::before, + .${headSelectionClassNameForClient}, .${headSelectionClassNameForClient}::after, .${headSelectionClassNameForClient}::before { background-color: ${user.color} !important; border-color: ${user.color} !important; } - .${headClassName}::after { + .${headSelectionClassNameForClient}::after { content: '${user.name}' } `.trim(); @@ -42,7 +48,9 @@ export class MonacoColorManager extends lifecycle.Disposable { constructor( awareness: Awareness, localUsername: string, - localUserColor: string + localUserColor: string, + headSelectionClassName: string, + selectionClassName: string ) { super(); @@ -52,8 +60,11 @@ export class MonacoColorManager extends lifecycle.Disposable { updated, removed, }: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any added: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any updated: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any removed: any; }) => { const changedClients = added.concat(updated).concat(removed); @@ -62,7 +73,12 @@ export class MonacoColorManager extends lifecycle.Disposable { const state = states.get(clientId); if (state?.user) { if (!this.userStore.has(clientId)) { - const element = generateUserAwarenessCSS(clientId, state.user); + const element = generateUserAwarenessCSS( + clientId, + state.user, + headSelectionClassName, + selectionClassName + ); this.userStore.set(clientId, { user: state.user, element }); } } else { @@ -98,7 +114,7 @@ export class MonacoColorManager extends lifecycle.Disposable { awareness.setLocalStateField("user", null); awareness.off("update", updateHandler); - for (let user of this.userStore.values()) { + for (const user of this.userStore.values()) { user.element.remove(); this.userStore.clear(); } diff --git a/packages/frame/src/MonacoElement.module.css b/packages/frame/src/MonacoElement.module.css new file mode 100644 index 000000000..4be6bb115 --- /dev/null +++ b/packages/frame/src/MonacoElement.module.css @@ -0,0 +1,45 @@ +.codeCell { + display: flex; + flex-direction: row; + padding: 15px 0; +} + +.codeCellSideIcon { + opacity: 0.5; + transition: opacity 0.25s ease-in-out; + margin-top: 2px; + margin-left: -5px; + margin-right: 4px; +} + +.codeCellSideIcon:hover { + opacity: 1; + transition: opacity 0.05s ease-in-out; +} + +.codeCellContent { + border-radius: 4px; + box-shadow: rgb(235, 236, 240) 0px 0px 0px 1.2px; + width: 100%; + flex: 1; +} + +.codeCellCode { + position: relative; + padding-left: 10px; + background: #f4f5f7; + width: 100%; /* todo: fix when making window smaller */ + min-height: 40px; /* so toolbar fits */ +} + +.monacoContainer { + height: 100%; +} +.codeCellOutput { + line-height: 0; + position: relative; +} + +.codeCellOutput > * { + line-height: normal; +} diff --git a/packages/frame/src/MonacoElement.tsx b/packages/frame/src/MonacoElement.tsx new file mode 100644 index 000000000..4e9a2f41a --- /dev/null +++ b/packages/frame/src/MonacoElement.tsx @@ -0,0 +1,263 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { NodeViewProps } from "@tiptap/core"; + +import * as monaco from "monaco-editor"; +import React, { + useCallback, + useContext, + useEffect, + useRef, + useState, +} from "react"; +import { VscChevronDown, VscChevronRight } from "react-icons/vsc"; + +import { BlockNoteEditor } from "@blocknote/core"; +import { useResource } from "@typecell-org/util"; +import LanguageSelector from "./LanguageSelector"; +import styles from "./MonacoElement.module.css"; +import { + applyDecorationsToMonaco, + applyNodeChangesToMonaco, + bindMonacoAndProsemirror, + textFromPMNode, +} from "./MonacoProsemirrorHelpers"; +import monacoStyles from "./MonacoSelection.module.css"; +import { RichTextContext } from "./RichTextContext"; +import { MonacoTypeCellCodeModel } from "./models/MonacoCodeModel"; +import { getMonacoModel } from "./models/MonacoModelManager"; + +const MonacoElementComponent = function MonacoElement( + props: NodeViewProps & { + block: any; + selectionHack: any; + blockNoteEditor: any; + } +) { + const editorRef = useRef(); + // const refa = useRef(Math.random()); + const context = useContext(RichTextContext); + + const models = useResource(() => { + // console.log("create", props.block.id, refa.current); + const uri = monaco.Uri.parse( + `file:///!${context.documentId}/${props.block.id}.cell.tsx` + ); + console.log("allocate model", uri.toString()); + + const model = getMonacoModel( + textFromPMNode(props.node), + props.block.props.language, + uri, + monaco + ); + + const codeModel = new MonacoTypeCellCodeModel(model.object); + context.compiler.registerModel(codeModel); // TODO: cleanup + + return [ + { + model: model.object, + codeModel, + state: { + isUpdating: false, + node: props.node, + lastDecorations: [] as string[], + }, + }, + () => { + console.log("dispose model", model.object.uri.toString()); + codeModel.dispose(); + model.dispose(); + }, + ]; + }, [context.compiler]); + + useEffect(() => { + if (models.model.isDisposed()) { + return; + } + models.state.isUpdating = true; + models.state.node = props.node; + try { + if (props.block.props.language !== models.codeModel.language) { + monaco.editor.setModelLanguage( + models.model, + props.block.props.language + ); + } + applyNodeChangesToMonaco(props.node, models.model); + models.state.lastDecorations = applyDecorationsToMonaco( + models.model, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + props.decorations as any, + editorRef.current!, + models.state.lastDecorations, + monacoStyles.yRemoteSelectionHead, + monacoStyles.yRemoteSelection + ); + } finally { + models.state.isUpdating = false; + } + }, [props.node, props.block, props.decorations, models]); + + // useImperativeHandle( + // ref, + // () => { + // return { + // setSelection(anchor: number, head: number) { + // console.log("SET"); + // }, + // }; + // }, + // [] + // ); + + useEffect(() => { + console.log("selected effect", props.selected); + if (props.selected) { + editorRef.current?.focus(); + } + }, [props.selected]); + + useEffect(() => { + // console.log("selectionHack effect", props.selectionHack); + if (!props.selectionHack) { + return; + } + const startPos = models.model.getPositionAt(props.selectionHack.anchor); + const endPos = models.model.getPositionAt(props.selectionHack.head); + models.state.isUpdating = true; + editorRef.current?.setSelection( + monaco.Selection.fromPositions(startPos, endPos) + ); + models.state.isUpdating = false; + editorRef.current?.focus(); + }, [models.model, models.state, props.selectionHack]); + + const codeRefCallback = useCallback( + (el: HTMLDivElement) => { + const editor = editorRef.current; + + if (editor) { + if (editor?.getContainerDomNode() !== el) { + // console.log("DISPOSE EDITOR"); + editor.dispose(); + editorRef.current = undefined; + } else { + // no need for new editor + return; + } + } + + if (!el) { + return; + } + + console.log("create editor"); + const newEditor = monaco.editor.create(el, { + model: models.model, + theme: "typecellTheme", + }); + + bindMonacoAndProsemirror( + newEditor, + props.editor.view, + props.getPos, + models.state + ); + + // disable per-cell find command (https://github.com/microsoft/monaco-editor/issues/102) + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (newEditor as any)._standaloneKeybindingService.addDynamicKeybinding( + "-actions.find", + null, // keybinding + () => { + // need to pass an empty handler + } + ); + + // if (initialFocus && initial.current) { + // initial.current = false; + // // newEditor.focus(); + // } + + newEditor.onDidBlurEditorWidget(() => { + newEditor.trigger("blur", "editor.action.formatDocument", {}); + }); + + newEditor.onDidContentSizeChange(() => { + const contentHeight = Math.min(500, newEditor.getContentHeight()); + + newEditor.layout({ + height: contentHeight, + width: newEditor.getContainerDomNode()!.offsetWidth, + }); + }); + + editorRef.current = newEditor; + }, + [models.model, models.state, props.editor.view, props.getPos] + ); + + const [codeVisible, setCodeVisible] = useState( + () => props.node.textContent.startsWith("// @default-collapsed") === false + ); + + return ( +
+ {codeVisible ? ( + setCodeVisible(false)} + /> + ) : ( + setCodeVisible(true)} + /> + )} + {} +
+ {codeVisible && ( +
+ {/* {props.toolbar && props.toolbar} */} + { + (props.blockNoteEditor as BlockNoteEditor).updateBlock( + props.block, + { + props: { + language: lang, + }, + } + ); + }} + /> +
+
+ )} + +
+ {context.executionHost.renderOutput( + models.model.uri.toString(), + () => { + // noop + } + )} +
+
+
+ ); +}; + +// TODO: check why this doesn't work +export const MonacoElement = React.memo(MonacoElementComponent); diff --git a/packages/frame/src/MonacoProsemirrorHelpers.ts b/packages/frame/src/MonacoProsemirrorHelpers.ts new file mode 100644 index 000000000..042909535 --- /dev/null +++ b/packages/frame/src/MonacoProsemirrorHelpers.ts @@ -0,0 +1,350 @@ +import * as monaco from "monaco-editor"; +import { Node } from "prosemirror-model"; +import { Selection, TextSelection, Transaction } from "prosemirror-state"; +import { Decoration, EditorView } from "prosemirror-view"; + +function selectionDir( + view: EditorView, + pos: number, + size: number, + dir: -1 | 1 +) { + const targetPos = pos + (dir < 0 ? 0 : size); + const selection = Selection.near(view.state.doc.resolve(targetPos), dir); + view.dispatch(view.state.tr.setSelection(selection).scrollIntoView()); + view.focus(); +} + +function getTransactionForSelectionUpdate( + selection: monaco.Selection | null, + model: monaco.editor.ITextModel | null, + offset: number, + tr: Transaction +) { + if (selection && model) { + const selFrom = model.getOffsetAt(selection.getStartPosition()) + offset; + const selEnd = model.getOffsetAt(selection.getEndPosition()) + offset; + tr.setSelection( + TextSelection.create( + tr.doc, + selection.getDirection() === monaco.SelectionDirection.LTR + ? selFrom + : selEnd, + selection.getDirection() === monaco.SelectionDirection.LTR + ? selEnd + : selFrom + ) + ); + } +} + +// because node.textContent doesn't preserve newlines +export function textFromPMNode(node: Node): string { + if (!node.isTextblock) { + throw new Error("not a text node"); + } + let text = ""; + node.forEach((c) => { + if (c.type.name === "hardBreak") { + text += "\n"; + } else if (c.isText) { + text += c.text; + } else { + throw new Error("not a text or hardBreak node"); + } + }); + + return text; +} + +export function bindMonacoAndProsemirror( + mon: monaco.editor.IStandaloneCodeEditor, + view: EditorView, + getPos: () => number, + state: { + isUpdating: boolean; + node: Node; + } +) { + // const id = Math.random(); + /** + * When the user selection changes in the monaco editor, we want to make sure the selection in the prosemirror document is updated accordingly. + */ + mon.onDidChangeCursorSelection((e) => { + console.log("change selection"); + + if (typeof getPos === "boolean") { + throw new Error("getPos is boolean"); + } + + if (state.isUpdating) { + return; + } + + if (!mon.hasTextFocus()) { + // only update prosemirror selection if the monaco editor actually has focus + // this makes sure prettier updates on blur don't reset the selection to the code editor + return; + } + + const offset = getPos() + 1; + + const tr = view.state.tr; + getTransactionForSelectionUpdate( + mon.getSelection(), + mon.getModel(), + offset, + tr + ); + try { + view.dispatch(tr); + } catch (e) { + console.error(e); + } + }); + + /** + * When changes are made by this user to the monaco editor, we want to apply those changes to the prosemirror document. + */ + mon.onDidChangeModelContent((e) => { + if (typeof getPos === "boolean") { + throw new Error("getPos is boolean"); + } + + if (state.isUpdating) { + return; + } + + // tmp fix for https://github.com/ProseMirror/prosemirror/issues/1407 + try { + getPos(); + console.log("getpos succeeded"); + } catch (e) { + console.log("getpos failed"); + return; + } + + const offset = getPos() + 1; + // { main } = update.state.selection; + + const tr = view.state.tr; + + e.changes.forEach((change) => { + if (change.text.length) { + tr.replaceWith( + offset + change.rangeOffset, + offset + change.rangeOffset + change.rangeLength, + view.state.schema.text(change.text.toString()) + ); + } else { + tr.delete( + offset + change.rangeOffset, + offset + change.rangeOffset + change.rangeLength + ); + } + // TODO: update offset? + }); + + if (mon.hasTextFocus()) { + // only update prosemirror selection if the monaco editor actually has focus + // this makes sure prettier updates on blur don't reset the selection to the code editor + getTransactionForSelectionUpdate( + mon.getSelection(), + mon.getModel(), + offset, + tr + ); + } + try { + view.dispatch(tr); + + // setTimeout(() => mon.focus(), 1000); + console.log(mon); + } catch (e) { + console.error(e); + } + }); + + /** + * When we're at the edges of the monaco editor, and the user hits an arrow key, + * we might want to move the selection outside of the monaco editor, and into other nodes + */ + mon.onKeyDown((e) => { + if (typeof getPos === "boolean") { + throw new Error("getPos is boolean"); + } + + // delete empty node on backspace + if (e.code === "Delete" || e.code === "Backspace") { + if (state.node.textContent === "") { + view.dispatch( + view.state.tr.deleteRange(getPos(), getPos() + state.node.nodeSize) + ); + view.focus(); + return; + } + } + + // handle arrow movements + const { lineNumber = 1, column = 1 } = mon.getPosition() || {}; + const model = mon.getModel(); + const maxLines = model?.getLineCount() || 1; + let dir: -1 | 1 | null = null; + if (e.code === "ArrowLeft") { + if (lineNumber !== 1 || column !== 1) { + return; + } + dir = -1; + } else if (e.code === "ArrowRight") { + if ( + lineNumber !== maxLines || + column - 1 !== model?.getLineLength(maxLines) + ) { + return; + } + dir = 1; + } else if (e.code === "ArrowUp") { + if (lineNumber !== 1) { + return; + } + dir = -1; + } else if (e.code === "ArrowDown") { + if (lineNumber !== maxLines) { + return; + } + dir = 1; + } + if (dir !== null) { + console.log("dir", dir, state.node.nodeSize); + selectionDir(view, getPos(), state.node.nodeSize, dir); + return; + } + }); +} + +/** + * This function takes care of applying changes from the prosemirror document to the monaco editor. + */ +export function applyNodeChangesToMonaco( + node: Node, + model: monaco.editor.ITextModel +) { + const newText = textFromPMNode(node); + const curText = model.getValue(); + if (newText === curText) { + return; + } + let start = 0, + curEnd = curText.length, + newEnd = newText.length; + while ( + start < curEnd && + curText.charCodeAt(start) === newText.charCodeAt(start) + ) { + ++start; + } + while ( + curEnd > start && + newEnd > start && + curText.charCodeAt(curEnd - 1) === newText.charCodeAt(newEnd - 1) + ) { + curEnd--; + newEnd--; + } + + model.applyEdits([ + { + range: monaco.Range.fromPositions( + model.getPositionAt(start), + model.getPositionAt(curEnd) + ), + text: newText.slice(start, newEnd), + }, + ]); +} + +/** + * This function takes care of showing prosemirror decorations (in our case, selections from other users) + * in the monaco editor. + * + * It's similar to this logic from y-monaco: https://github.com/yjs/y-monaco/blob/96a73c6a67daf85f75e8a136bc66c8f29b329ed9/src/y-monaco.js#L88 + */ +export function applyDecorationsToMonaco( + model: monaco.editor.ITextModel, + decorations: { + decorations: Decoration[]; + innerDecorations: { local: Decoration[] }; + }, + mon: monaco.editor.IStandaloneCodeEditor, + lastDecorations: string[], + headSelectionClassName: string, + selectionClassName: string +) { + if (!decorations.innerDecorations) { + return []; + } + const newDecorations: monaco.editor.IModelDeltaDecoration[] = []; + // const decs = (innerDecorations as any).local as Decoration[]; + + decorations.innerDecorations.local + .filter((d) => d.spec.type === "cursor") + .forEach((cursorDec) => { + const selectionDec = decorations.innerDecorations.local.find( + (d) => + d.spec.type === "selection" && + d.spec.clientID === cursorDec.spec.clientID + ); + + let start: monaco.Position; + let end: monaco.Position; + let afterContentClassName: string | undefined; + let beforeContentClassName: string | undefined; + + const to = cursorDec.to; + const from = selectionDec + ? selectionDec.from === to + ? selectionDec.to + : selectionDec.from + : to; + + if (from < to) { + start = model.getPositionAt(from); + end = model.getPositionAt(to); + afterContentClassName = + headSelectionClassName + + " " + + headSelectionClassName + + "-" + + cursorDec.spec.clientId; + } else { + start = model.getPositionAt(to); + end = model.getPositionAt(from); + beforeContentClassName = + headSelectionClassName + + " " + + headSelectionClassName + + "-" + + cursorDec.spec.clientId; + } + newDecorations.push({ + range: new monaco.Range( + start.lineNumber, + start.column, + end.lineNumber, + end.column + ), + options: { + className: + selectionClassName + + " " + + selectionClassName + + "-" + + cursorDec.spec.clientId, + afterContentClassName, + beforeContentClassName, + }, + }); + }); + + return mon.deltaDecorations(lastDecorations, newDecorations); +} diff --git a/packages/frame/src/MonacoSelection.module.css b/packages/frame/src/MonacoSelection.module.css new file mode 100644 index 000000000..0a1d78bc6 --- /dev/null +++ b/packages/frame/src/MonacoSelection.module.css @@ -0,0 +1,27 @@ +.yRemoteSelection { + position: relative; + background-color: rgb(250, 129, 0); + opacity: 0.5; +} + +.yRemoteSelectionHead { + position: absolute; + border-left: orange solid 2px; + border-top: orange solid 2px; + border-bottom: orange solid 2px; + height: 100%; + box-sizing: border-box; +} + +.yRemoteSelectionHead::after { + box-sizing: border-box; + z-index: 10000; + opacity: 1; + position: absolute; + left: -2px; + top: 100%; + border-radius: 3px; + border-top-left-radius: 0; + padding: 0 5px; + color: #0d0d0d; +} diff --git a/packages/frame/src/RichTextContext.ts b/packages/frame/src/RichTextContext.ts new file mode 100644 index 000000000..dbe6028fb --- /dev/null +++ b/packages/frame/src/RichTextContext.ts @@ -0,0 +1,16 @@ +import { createContext } from "react"; +import SourceModelCompiler from "./runtime/compiler/SourceModelCompiler"; +import { ExecutionHost } from "./runtime/executor/executionHosts/ExecutionHost"; + +export const RichTextContext = createContext<{ + executionHost: ExecutionHost; + compiler: SourceModelCompiler; + documentId: string; +}>({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + executionHost: undefined as any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + compiler: undefined as any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + documentId: undefined as any, +}); diff --git a/packages/frame/src/index.ts b/packages/frame/src/index.ts new file mode 100644 index 000000000..0435b6914 --- /dev/null +++ b/packages/frame/src/index.ts @@ -0,0 +1 @@ +export * from "./Frame"; diff --git a/packages/frame/src/models/MonacoCodeModel.ts b/packages/frame/src/models/MonacoCodeModel.ts new file mode 100644 index 000000000..e9cd79cdf --- /dev/null +++ b/packages/frame/src/models/MonacoCodeModel.ts @@ -0,0 +1,58 @@ +import { CodeModel } from "@typecell-org/shared"; +import type * as monaco from "monaco-editor"; +import { event, lifecycle } from "vscode-lib"; + +export class MonacoTypeCellCodeModel + extends lifecycle.Disposable + implements CodeModel +{ + private readonly _onWillDispose: event.Emitter = this._register( + new event.Emitter() + ); + public readonly onWillDispose: event.Event = this._onWillDispose.event; + + private readonly _onDidChangeContent: event.Emitter = this._register( + new event.Emitter() + ); + public readonly onDidChangeContent: event.Event = + this._onDidChangeContent.event; + + constructor(private readonly monacoModel: monaco.editor.ITextModel) { + super(); + + this._register( + monacoModel.onDidChangeLanguage(() => { + this._onDidChangeContent.fire(); + }) + ); + + this._register( + monacoModel.onDidChangeContent(() => { + this._onDidChangeContent.fire(); + }) + ); + + this._register( + monacoModel.onWillDispose(() => { + this._onWillDispose.fire(); + }) + ); + } + + public get uri() { + return this.monacoModel.uri; + } + + public get path() { + return this.monacoModel.uri.toString(); + } + + public get language() { + // TODO: what if language changes? + return this.monacoModel.getLanguageId(); + } + + public getValue() { + return this.monacoModel.getValue(); + } +} diff --git a/packages/frame/src/models/MonacoModelManager.ts b/packages/frame/src/models/MonacoModelManager.ts new file mode 100644 index 000000000..8afddc9c4 --- /dev/null +++ b/packages/frame/src/models/MonacoModelManager.ts @@ -0,0 +1,43 @@ +import type * as monaco from "monaco-editor"; +import { lifecycle } from "vscode-lib"; + +class ModelCollection extends lifecycle.ReferenceCollection { + protected createReferencedObject( + key: string, + ...args: [string, string, monaco.Uri, typeof monaco] + ): monaco.editor.IModel { + return args[3].editor.createModel(args[0], args[1], args[2]); + } + + protected destroyReferencedObject( + key: string, + object: monaco.editor.IModel + ): void { + object.dispose(); + } +} + +const modelStore = new ModelCollection(); + +/** + * This is a helper function to get monaco models. Because monaco models are registered in the global monaco.editor, + * and multiple places in the code base might need access to the same monaco model, we need to make sure that we + * track references of the monaco models so that they are not disposed prematurely. + * + * This way, references are tracked using the ReferenceCollection. Only if all references to a monaco model are + * released, the monaco model will be disposed. + */ +export function getMonacoModel( + code: string, + language: string, + path: monaco.Uri, + monacoInstance: typeof monaco +) { + return modelStore.acquire( + path.toString(), + code, + language, + path, + monacoInstance + ); +} diff --git a/packages/frame/src/runtime/compiler/SourceModelCompiler.test.ts b/packages/frame/src/runtime/compiler/SourceModelCompiler.test.ts new file mode 100644 index 000000000..ce0c996bf --- /dev/null +++ b/packages/frame/src/runtime/compiler/SourceModelCompiler.test.ts @@ -0,0 +1,36 @@ +import * as monaco from "monaco-editor/esm/vs/editor/editor.api.js"; +import "monaco-editor/esm/vs/language/typescript/monaco.contribution.js"; +import { expect, it } from "vitest"; +import { event } from "vscode-lib"; + +import { BasicCodeModel } from "../../../../shared/src/codeModels/BasicCodeModel"; +import { setMonacoDefaults } from "../editor"; +import SourceModelCompiler from "./SourceModelCompiler"; +/** + * @vitest-environment jsdom + */ + +setMonacoDefaults(monaco); + +it("compiles Typescript code", async () => { + const m1Code = `export let y: number = 43;`; + + const m1 = new BasicCodeModel("c1a.ts", m1Code, "typescript"); + + const compiler = new SourceModelCompiler(monaco); + compiler.registerModel(m1); + expect(compiler.models.length).toBe(1); + const model = compiler.models[0]; + + await event.Event.toPromise(model.onDidChangeContent); + + expect(model.getValue()).toMatchInlineSnapshot(` + "define([\\"require\\", \\"exports\\"], function (require, exports) { + \\"use strict\\"; + Object.defineProperty(exports, \\"__esModule\\", { value: true }); + exports.y = void 0; + exports.y = 43; + }); + " + `); +}); diff --git a/packages/editor/src/runtime/compiler/SourceModelCompiler.ts b/packages/frame/src/runtime/compiler/SourceModelCompiler.ts similarity index 53% rename from packages/editor/src/runtime/compiler/SourceModelCompiler.ts rename to packages/frame/src/runtime/compiler/SourceModelCompiler.ts index c930d3b7e..0003a62c8 100644 --- a/packages/editor/src/runtime/compiler/SourceModelCompiler.ts +++ b/packages/frame/src/runtime/compiler/SourceModelCompiler.ts @@ -1,17 +1,22 @@ import type * as monaco from "monaco-editor"; -import { lifecycle, event } from "vscode-lib"; +import { event, lifecycle } from "vscode-lib"; + +import { BasicCodeModel, CodeModel, ModelProvider } from "@typecell-org/shared"; + +import { getMonacoModel } from "../../models/MonacoModelManager"; import { compile } from "./compilers/MonacoCompiler"; -import { CompiledCodeModel } from "../../models/CompiledCodeModel"; -import { TypeCellCodeModel } from "../../models/TypeCellCodeModel"; -export default class SourceModelCompiler extends lifecycle.Disposable { - private disposed: boolean = false; +export default class SourceModelCompiler + extends lifecycle.Disposable + implements ModelProvider +{ + public disposed = false; - private async compile(sourceModel: TypeCellCodeModel) { - if (sourceModel.language === "typescript") { - const js = await compile(sourceModel, this.monacoInstance); + private async compile(model: monaco.editor.ITextModel) { + if (model.getLanguageId() === "typescript") { + const js = await compile(model, this.monacoInstance); return js; - } else if (sourceModel.language === "markdown") { + } else if (model.getLanguageId() === "markdown") { // TODO: this is a hacky way to quickly support markdown. We compile markdown to JS so it can pass through the regular "evaluator". // We should refactor to support different languages, probably by creating different CellEvaluators per language return `define(["require", "exports", "markdown-it"], function (require, exports, markdown_it_1) { @@ -22,14 +27,15 @@ export default class SourceModelCompiler extends lifecycle.Disposable { linkify: true, typographer: true, }); - const render = md.render(${JSON.stringify(sourceModel.getValue())}); + + const render = md.render(${JSON.stringify(model.getValue())}); const el = document.createElement("div"); el.className = "markdown-body"; el.innerHTML = render; exports.default = el; ; });`; - } else if (sourceModel.language === "css") { + } else if (model.getLanguageId() === "css") { // TODO: same as above comment for markdown return `define(["require", "exports"], function (require, exports) { "use strict"; @@ -37,7 +43,7 @@ export default class SourceModelCompiler extends lifecycle.Disposable { const style = document.createElement("style"); style.setAttribute("type", "text/css"); style.appendChild(document.createTextNode(${JSON.stringify( - sourceModel.getValue() + model.getValue() )})); exports.default = style; ; @@ -48,16 +54,20 @@ export default class SourceModelCompiler extends lifecycle.Disposable { public readonly registeredModels = new Map< string, - { sourceModel: TypeCellCodeModel; compiledModel: CompiledCodeModel } + { + sourceModel: CodeModel; + monacoModel: { object: monaco.editor.ITextModel; dispose: () => void }; + compiledModel: BasicCodeModel; + } >(); - private readonly _onDidCreateCompiledModel: event.Emitter = - this._register(new event.Emitter()); + private readonly _onDidCreateModel: event.Emitter = + this._register(new event.Emitter()); - public readonly onDidCreateCompiledModel: event.Event = - this._onDidCreateCompiledModel.event; + public readonly onDidCreateModel: event.Event = + this._onDidCreateModel.event; - public get compiledModels() { + public get models() { return Array.from(this.registeredModels.values()).map( (el) => el.compiledModel ); @@ -69,7 +79,7 @@ export default class SourceModelCompiler extends lifecycle.Disposable { * When the model is disposed (model.dispose()), the model is automatically unregistered. * @param model model to register */ - public registerModel(sourceModel: TypeCellCodeModel) { + public registerModel(sourceModel: CodeModel) { if (this.disposed) { throw new Error("registering model on disposed engine"); } @@ -78,11 +88,27 @@ export default class SourceModelCompiler extends lifecycle.Disposable { return; } // TODO: perhaps not register empty compiled model? - const compiledModel = new CompiledCodeModel(sourceModel.path, ""); - this.registeredModels.set(sourceModel.path, { sourceModel, compiledModel }); + const compiledModel = new BasicCodeModel( + sourceModel.path, + "", + "javascript" + ); + + const monacoModel = getMonacoModel( + sourceModel.getValue(), + sourceModel.language, + sourceModel.uri, + this.monacoInstance + ); + + this.registeredModels.set(sourceModel.path, { + sourceModel, + monacoModel, + compiledModel, + }); const compile = async () => { try { - const compiled = await this.compile(sourceModel); + const compiled = await this.compile(monacoModel.object); compiledModel.setValue(compiled); } catch (e) { console.error("compile error", e); @@ -90,17 +116,25 @@ export default class SourceModelCompiler extends lifecycle.Disposable { } }; let prevValue: string | undefined = sourceModel.getValue(); + let prevLanguage: string | undefined = sourceModel.language; this._register( sourceModel.onDidChangeContent((_event) => { - if (sourceModel.getValue() !== prevValue) { - // make sure there were actual changes from the previous value - - prevValue = sourceModel.getValue(); - compile(); - } else { + // make sure there were actual changes from the previous value + const newValue = sourceModel.getValue(); + const newLanguage = sourceModel.language; + if (newValue === prevValue && newLanguage === prevLanguage) { console.warn("same value"); + return; + } + if (monacoModel.object.getValue() !== newValue) { + // make sure models are in sync. If sourceModel is actualy a MonacoCodeModel, this will already be the case + monacoModel.object.setValue(newValue); } + + prevValue = newValue; + prevLanguage = newLanguage; + compile(); }) ); @@ -109,17 +143,16 @@ export default class SourceModelCompiler extends lifecycle.Disposable { this._register( sourceModel.onWillDispose(() => { - const compiledModel = this.registeredModels.get( - sourceModel.path - )?.compiledModel; - if (!compiledModel) { - throw new Error("unexpected: compiled model not found"); + const models = this.registeredModels.get(sourceModel.path); + if (!models) { + throw new Error("unexpected: model not found"); } this.registeredModels.delete(sourceModel.path); - compiledModel.dispose(); + models.compiledModel.dispose(); + models.monacoModel.dispose(); }) ); - this._onDidCreateCompiledModel.fire(compiledModel); + this._onDidCreateModel.fire(compiledModel); } constructor( @@ -133,6 +166,12 @@ export default class SourceModelCompiler extends lifecycle.Disposable { if (this.disposed) { throw new Error("CompileEngine already disposed"); } + + this.registeredModels.forEach((el) => { + el.compiledModel.dispose(); + el.monacoModel.dispose(); + }); + this.disposed = true; super.dispose(); } diff --git a/packages/editor/src/runtime/compiler/compilers/MonacoCompiler.ts b/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts similarity index 78% rename from packages/editor/src/runtime/compiler/compilers/MonacoCompiler.ts rename to packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts index 915e2acb4..d0667eada 100644 --- a/packages/editor/src/runtime/compiler/compilers/MonacoCompiler.ts +++ b/packages/frame/src/runtime/compiler/compilers/MonacoCompiler.ts @@ -1,6 +1,7 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable prefer-spread */ import type * as monaco from "monaco-editor"; -import { TypeCellCodeModel } from "../../../models/TypeCellCodeModel"; -import { hash } from "../../../util/hash"; +import { hash } from "vscode-lib"; let mainWorker: WorkerType; @@ -41,6 +42,7 @@ type WorkerType = ( ) => Promise; async function getCompiledCode(worker: WorkerType, uri: monaco.Uri) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const process = (await worker(uri))!; const uriCode = await getCompiledCodeInternal(process, uri); return uriCode; @@ -48,17 +50,21 @@ async function getCompiledCode(worker: WorkerType, uri: monaco.Uri) { // for performance: don't fire all compilations immediately. Compile once first, so we can use recompilation results // TODO: verify performance improvement +// eslint-disable-next-line @typescript-eslint/ban-types function awaitFirst(func: T): T { return async function () { - // @ts-ignore - let args = arguments; + // eslint-disable-next-line prefer-rest-params + const args = arguments; if (initialPromise) { try { await initialPromise; - } catch (e) {} + } catch (e) { + // noop + } return func.apply(null, args); } + // eslint-disable-next-line no-async-promise-executor initialPromise = new Promise(async (resolve, reject) => { try { const ret = await func.apply(null, args); @@ -75,15 +81,15 @@ function awaitFirst(func: T): T { const ENABLE_CACHE = true; function saveCachedItem( - model: TypeCellCodeModel, + model: monaco.editor.ITextModel, item: { hash: string; compiledCode: string } ) { - const key = "cc-" + model.path; + const key = "cc-" + model.uri.toString(false); localStorage.setItem(key, JSON.stringify(item)); } -function getCachedItem(model: TypeCellCodeModel) { - const key = "cc-" + model.path; +function getCachedItem(model: monaco.editor.ITextModel) { + const key = "cc-" + model.uri.toString(false); const cached = localStorage.getItem(key); if (cached) { try { @@ -128,34 +134,33 @@ async function getWorker(monacoInstance: typeof monaco) { return mainWorker; } async function _compile( - model: TypeCellCodeModel, + model: monaco.editor.ITextModel, monacoInstance: typeof monaco ) { const tscode = model.getValue(); - const hsh = hash(tscode) + ""; + const hsh = hash.stringHash(tscode, 0) + ""; if (ENABLE_CACHE) { const cached = getCachedItem(model); if (cached && cached.hash === hsh) { - console.log("cache hit", model.path); + console.log("cache hit", model.uri.toString()); return cached.compiledCode; } } - console.log("recompile", model.path); + console.log("recompile", model.uri.toString()); - const monacoModel = model.acquireMonacoModel(); try { const worker = await getWorker(monacoInstance); - let compiledCode = (await getCompiledCode(worker, monacoModel.uri)) - .firstJSCode; + const compiledCode = (await getCompiledCode(worker, model.uri)).firstJSCode; if (ENABLE_CACHE) { saveCachedItem(model, { hash: hsh, compiledCode }); } // console.log(tscode, compiledCode); return compiledCode; } finally { - model.releaseMonacoModel(); + // monacoModel.dispose(); + // model.releaseMonacoModel(); } } diff --git a/packages/editor/src/runtime/editor/MonacoContext.ts b/packages/frame/src/runtime/editor/MonacoContext.ts similarity index 72% rename from packages/editor/src/runtime/editor/MonacoContext.ts rename to packages/frame/src/runtime/editor/MonacoContext.ts index dfcf26b00..948cab4ec 100644 --- a/packages/editor/src/runtime/editor/MonacoContext.ts +++ b/packages/frame/src/runtime/editor/MonacoContext.ts @@ -1,6 +1,7 @@ -import React from "react"; import type * as monaco from "monaco-editor"; +import React from "react"; export const MonacoContext = React.createContext({ + // eslint-disable-next-line @typescript-eslint/no-explicit-any monaco: undefined as any as typeof monaco, }); diff --git a/packages/editor/src/runtime/editor/README.md b/packages/frame/src/runtime/editor/README.md similarity index 100% rename from packages/editor/src/runtime/editor/README.md rename to packages/frame/src/runtime/editor/README.md diff --git a/packages/editor/src/runtime/editor/__tests__/code.test.ts b/packages/frame/src/runtime/editor/__tests__/code.test.ts similarity index 59% rename from packages/editor/src/runtime/editor/__tests__/code.test.ts rename to packages/frame/src/runtime/editor/__tests__/code.test.ts index 024120140..c2a23da02 100644 --- a/packages/editor/src/runtime/editor/__tests__/code.test.ts +++ b/packages/frame/src/runtime/editor/__tests__/code.test.ts @@ -1,13 +1,13 @@ -import { Engine } from "@typecell-org/engine"; import * as monaco from "monaco-editor/esm/vs/editor/editor.api.js"; import "monaco-editor/esm/vs/language/typescript/monaco.contribution.js"; import { expect, it } from "vitest"; import { event } from "vscode-lib"; -import * as Y from "yjs"; import { setMonacoDefaults } from ".."; -import { TypeCellCodeModel } from "../../../models/TypeCellCodeModel"; + +import { ReactiveEngine } from "@typecell-org/engine"; +import { BasicCodeModel } from "../../../../../shared/src/codeModels/BasicCodeModel"; import SourceModelCompiler from "../../compiler/SourceModelCompiler"; -import { getTypeCellResolver } from "../../executor/resolver/resolver"; +// import { getTypeCellResolver } from "../../executor/resolver/TypeCellModuleResolver"; /** * @vitest-environment jsdom */ @@ -15,24 +15,16 @@ import { getTypeCellResolver } from "../../executor/resolver/resolver"; setMonacoDefaults(monaco); it("basic code execution", async () => { - const doc = new Y.Doc(); - const m1Code = new Y.Text(`export let y = 43;`); - const m2Code = new Y.Text(`export let x = 432;`); - doc.getMap("map").set("m1", m1Code); - doc.getMap("map").set("m2", m2Code); - - //monaco.editor.createModel("// tesdft", "typescript"); + const m1Code = `export let y = 43;`; - let m1 = new TypeCellCodeModel("c1a.ts", "typescript", m1Code, monaco); + const m1 = new BasicCodeModel("c1a.ts", m1Code, "typescript"); - let compiler = new SourceModelCompiler(monaco); + const compiler = new SourceModelCompiler(monaco); compiler.registerModel(m1); // let m2 = new TypeCellCodeModel("c2.ts", "typescript", m2Code, monaco); // compiler.registerModel(m2); - let engine = new Engine( - getTypeCellResolver("docid", "testEngine", undefined) - ); + const engine = new ReactiveEngine(async () => undefined); engine.registerModelProvider(compiler); await event.Event.toPromise(engine.onOutput); // first compilation will be empty diff --git a/packages/editor/src/runtime/editor/compilerOptions.ts b/packages/frame/src/runtime/editor/compilerOptions.ts similarity index 100% rename from packages/editor/src/runtime/editor/compilerOptions.ts rename to packages/frame/src/runtime/editor/compilerOptions.ts diff --git a/packages/editor/src/runtime/editor/index.ts b/packages/frame/src/runtime/editor/index.ts similarity index 61% rename from packages/editor/src/runtime/editor/index.ts rename to packages/frame/src/runtime/editor/index.ts index 583118277..b1acc863a 100644 --- a/packages/editor/src/runtime/editor/index.ts +++ b/packages/frame/src/runtime/editor/index.ts @@ -2,21 +2,51 @@ import type * as Monaco from "monaco-editor"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import EditorWorker from "./workers/editor.worker?worker"; // eslint-disable-line import/no-webpack-loader-syntax +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import TsWorker from "./workers/ts.worker?worker"; // eslint-disable-line import/no-webpack-loader-syntax +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import CSSWorker from "monaco-editor/esm/vs/language/css/css.worker?worker"; import { getDefaultSandboxCompilerOptions } from "./compilerOptions"; import { setupPrettier } from "./prettier"; +// eslint-disable-next-line @typescript-eslint/no-explicit-any if (!(window as any).MonacoEnvironment) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any (window as any).MonacoEnvironment = (global as any).MonacoEnvironment = { getWorker: function (workerId: string, label: string) { if (label === "typescript" || label === "javascript") { - return new TsWorker(); + const w = new TsWorker(); // TsWorker(); + return w; + // w.port.start(); + + // return { + // postMessage: w.port.postMessage.bind(w.port), + // addEventListener: w.port.addEventListener.bind(w.port), + // removeEventListener: w.port.removeEventListener.bind(w.port), + // terminate: () => { + // // noop + // }, + // get onmessage() { + // return w.port.onmessage; + // }, + // // eslint-disable-next-line @typescript-eslint/no-explicit-any + // set onmessage(val: any) { + // w.port.onmessage = val; + // }, + // get onmessageerror() { + // return w.port.onmessageerror; + // }, + // // eslint-disable-next-line @typescript-eslint/no-explicit-any + // set onmessageerror(val: any) { + // w.port.onmessageerror = val; + // }, + // }; } if (label === "json") { throw new Error("not implemented"); @@ -61,6 +91,19 @@ const sharedEditorOptions: Monaco.editor.IEditorOptions = { export const setMonacoDefaults = (monaco: typeof Monaco) => { // const getWorker = monaco.languages.typescript.getTypeScriptWorker; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + monaco.editor.EditorOptions.minimap.defaultValue = { enabled: false } as any; + monaco.editor.EditorOptions.scrollBeyondLastLine.defaultValue = false; + monaco.editor.EditorOptions.overviewRulerLanes.defaultValue = 0; + monaco.editor.EditorOptions.lineNumbersMinChars.defaultValue = 3; + + // monaco.editor.EditorOptions.lineNumbers.defaultValue = 1 as any; + // monaco.editor.EditorOptions.tab.defaultValue = 2; + monaco.editor.EditorOptions.scrollbar.defaultValue = { + ...monaco.editor.EditorOptions.scrollbar.defaultValue, + alwaysConsumeMouseWheel: false, + }; + monaco.editor.EditorOptions.formatOnPaste.defaultValue = true; const defaults = monaco.languages.typescript.typescriptDefaults; @@ -71,7 +114,7 @@ export const setMonacoDefaults = (monaco: typeof Monaco) => { diagnosticCodesToIgnore: [2354, 1108, 1378], // TODO: move except 2354, should probably be passed in from sandbox consumer }); - let compilerOptions = { + const compilerOptions = { ...getDefaultSandboxCompilerOptions( { useJavaScript: false }, monaco.languages.typescript @@ -85,6 +128,7 @@ export const setMonacoDefaults = (monaco: typeof Monaco) => { colors: { "editor.background": "#f4f5f7", }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any rules: [{ background: "#f4f5f7" } as any], }); setupPrettier(monaco); diff --git a/packages/frame/src/runtime/editor/languages/typescript/CompressedCache.ts b/packages/frame/src/runtime/editor/languages/typescript/CompressedCache.ts new file mode 100644 index 000000000..0c510dfc7 --- /dev/null +++ b/packages/frame/src/runtime/editor/languages/typescript/CompressedCache.ts @@ -0,0 +1,63 @@ +import * as localForage from "localforage"; +import lzstring from "lz-string"; +import { compress, decompress } from "./compress"; + +const SUPPORTS_COMPRESSIONSTREAM = "CompressionStream" in window; + +export class CompressedCache { + constructor(private readonly cacheTimeout: number = 604800000 /* 1 week*/) {} + + async getItem(key: string): Promise { + const cached = await localForage.getItem<{ + date: string; + format: string; + data: string | ArrayBuffer + }>(key); + if (!cached) { + return undefined; + } + + // const [dateString, format, text] = cached.split("-=-^-=-"); + const cachedDate = new Date(cached.date); + const now = new Date(); + + if (now.getTime() - cachedDate.getTime() > this.cacheTimeout) { + // timed out + return undefined; + } + if (cached.format === "lz") { + return lzstring.decompressFromUTF16(cached.data as string); + } + + if (cached.format === "csgzip" && SUPPORTS_COMPRESSIONSTREAM) { + const dc = await decompress(cached.data as ArrayBuffer) + return dc; + } + return undefined; + } + + async setItem(key: string, value: string) { + const now = new Date(); + + let compressed: string | ArrayBuffer; + let format: string; + + if (SUPPORTS_COMPRESSIONSTREAM) { + format = "csgzip"; + compressed = + await compress(value) + + } else { + format = "lz"; + compressed = lzstring.compressToUTF16(value); + } + + const cacheContent = { + date: now.toISOString(), + format, + data: compressed + } + + localForage.setItem(key, cacheContent); + } +} diff --git a/packages/frame/src/runtime/editor/languages/typescript/TypeCellHelperTypeResolver.ts b/packages/frame/src/runtime/editor/languages/typescript/TypeCellHelperTypeResolver.ts new file mode 100644 index 000000000..16f1cd984 --- /dev/null +++ b/packages/frame/src/runtime/editor/languages/typescript/TypeCellHelperTypeResolver.ts @@ -0,0 +1,89 @@ +import type * as monaco from "monaco-editor"; + +import { detectNewImportsToAcquireTypeFor } from "./typeAcquisition"; +/** + * Uses type definitions emitted by npm run emittypes to the public/types directory. + * Now we can use types from this typecell codebase in the runtime + * + * TODO: if loading multiple modules, we won't reuse underlying types and they will be reloaded from public/types, + * might not be ideal architecture but probably also doesn't have a large impact + */ +async function loadTypecellLibTypes( + moduleName: string, + typecellTypePath: string, + monacoInstance: typeof monaco +) { + const lib = ` + import getExposeGlobalVariables from "${typecellTypePath}"; + let exp: ReturnType; + export default exp; + `; + + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( + lib, + `file:///node_modules/@types/${moduleName}/index.d.ts` + ); + + await detectNewImportsToAcquireTypeFor( + lib, + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib.bind( + monacoInstance.languages.typescript.typescriptDefaults + ), + window.fetch.bind(window), + console, // TODO + moduleName + ); +} + +/** + * This adds OnlyViews and Values to use in ts.worker.ts + */ +function addHelperFiles(monacoInstance: typeof monaco) { + const content = ` +import type * as React from "react"; + +type ReactView = React.ReactElement<{__tcObservable: T}>; + +export type OnlyViews = { + // [E in keyof T as T[E] extends ReactView ? E : never]: T[E]; + [E in keyof T]: T[E] extends ReactView ? T[E] : never; +}; + +export type Values = { + [E in keyof T]: T[E] extends ReactView ? B : T[E]; +}; +`; + // register the typings as a node_module. + // These typings are automatically imported as $ in ts.worker.ts + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( + content, + `file:///node_modules/@types/typecell-helpers/index.d.ts` + ); +} + +/** + * Registers the types for: + * - user written code and the $ context variable + * - built in helper library + * + * These types are automatically imported in the cell / plugin context, in ts.worker.ts + */ +export async function setupTypecellHelperTypeResolver( + monacoInstance: typeof monaco +) { + // Loads types for "typecell-plugin" helper library, as defined in pluginEngine/lib/exports + // await loadTypecellLibTypes( + // "typecell-plugin", + // "./pluginEngine/lib/exports", + // monacoInstance + // ).catch(console.error); + + addHelperFiles(monacoInstance); + + // Loads types for standard "typecell" helper library, as defined in typecellEngine/lib/exports + await loadTypecellLibTypes( + "typecell", + "./runtime/executor/lib/exports", + monacoInstance + ).catch(console.error); +} diff --git a/packages/frame/src/runtime/editor/languages/typescript/TypeCellModuleTypeResolver.ts b/packages/frame/src/runtime/editor/languages/typescript/TypeCellModuleTypeResolver.ts new file mode 100644 index 000000000..54e802f96 --- /dev/null +++ b/packages/frame/src/runtime/editor/languages/typescript/TypeCellModuleTypeResolver.ts @@ -0,0 +1,75 @@ +import type * as monaco from "monaco-editor"; + +function refreshUserModelTypes(folder: string, monacoInstance: typeof monaco) { + // find all typecell scripts in the folder + const models = monacoInstance.editor + .getModels() + .filter((m) => { + const path = m.uri.path; + return ( + path.startsWith(folder) && + (path.endsWith(".tsx") || + (path.endsWith(".ts") && !path.endsWith(".d.ts"))) + ); + }) + .map((m) => m.uri.toString().replace(/(\.ts|\.tsx)$/, "")); + + if (!folder.startsWith("/!") && !folder.endsWith("/")) { + throw new Error("expected folder to start with / and end with /"); + } + + const folderName = folder.substring("/".length, folder.length - 1); // !typecell:typecell.org/dALYTUW8TXxsw + + const content = models.map((f) => `export * from "${f}";`).join("\n"); + + // register the typings as a node_module in the full folder name (e.g.: !typecell:typecell.org/dALYTUW8TXxsw) + // These typings are automatically imported as $ in ts.worker.ts + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( + content, + `file:///node_modules/@types/${folderName}/index.d.ts` + ); +} + +/** + * This exposes the types of the context to the monaco runtime + */ +function listenForTypecellUserModels(monacoInstance: typeof monaco) { + if (monacoInstance.editor.getModels().length > 0) { + // Note / improve: only listens for new models, doesn't inspect already + // registered models. For now ok as it's called on startup (before models are added) + console.error( + "unexpected, listenForTypecellUserModels should be called before models are registered" + ); + } + monacoInstance.editor.onDidCreateModel((model) => { + if (!model.uri.path.startsWith("/!")) { + return; + } + + // model.onDidChangeContent((e) => {}); + const folder = model.uri.path.substring( + 0, + model.uri.path.lastIndexOf("/") + 1 + ); + + refreshUserModelTypes(folder, monacoInstance); + model.onWillDispose(() => { + // console.log("dispose", model.uri.toString()); + refreshUserModelTypes(folder, monacoInstance); + }); + }); +} + +/** + * Registers the types for: + * - user written code and the $ context variable + * - built in helper library + * + * These types are automatically imported in the cell / plugin context, in ts.worker.ts + */ +export async function setupTypecellModuleTypeResolver( + monacoInstance: typeof monaco +) { + // Loads types for $ context variables + listenForTypecellUserModels(monacoInstance); +} diff --git a/packages/frame/src/runtime/editor/languages/typescript/compress.browsertest.ts b/packages/frame/src/runtime/editor/languages/typescript/compress.browsertest.ts new file mode 100644 index 000000000..6e103e2d7 --- /dev/null +++ b/packages/frame/src/runtime/editor/languages/typescript/compress.browsertest.ts @@ -0,0 +1,9 @@ +import { expect } from "chai"; +import { compress, decompress } from "./compress"; + +it("compresses / decompressess", async () => { + const str = "hello world ấɖḯƥĭṩčįɳġ ḝłįʈ 🥳"; + const compressed = await compress(str); + const decompressed = await (await decompress(compressed)); + expect(decompressed).to.eq(str); +}); diff --git a/packages/frame/src/runtime/editor/languages/typescript/compress.ts b/packages/frame/src/runtime/editor/languages/typescript/compress.ts new file mode 100644 index 000000000..5e689b2ea --- /dev/null +++ b/packages/frame/src/runtime/editor/languages/typescript/compress.ts @@ -0,0 +1,21 @@ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +export async function compress(text: string) { + const byteArray = new TextEncoder().encode(text) + // @ts-ignore + const cs = new CompressionStream("deflate") + const writer = cs.writable.getWriter() + writer.write(byteArray) + writer.close() + const ret = await new Response(cs.readable).arrayBuffer() + return ret; +} + +export async function decompress(bytes: ArrayBuffer) { + // @ts-ignore + const cs = new DecompressionStream("deflate") + const writer = cs.writable.getWriter() + writer.write(bytes) + writer.close() + const arrayBuffer = await new Response(cs.readable).arrayBuffer() + return new TextDecoder().decode(arrayBuffer) +} diff --git a/packages/editor/src/runtime/editor/languages/typescript/npmTypeResolver.ts b/packages/frame/src/runtime/editor/languages/typescript/npmTypeResolver.ts similarity index 80% rename from packages/editor/src/runtime/editor/languages/typescript/npmTypeResolver.ts rename to packages/frame/src/runtime/editor/languages/typescript/npmTypeResolver.ts index f96c8593f..53e6f93ed 100644 --- a/packages/editor/src/runtime/editor/languages/typescript/npmTypeResolver.ts +++ b/packages/frame/src/runtime/editor/languages/typescript/npmTypeResolver.ts @@ -1,7 +1,7 @@ -import { detectNewImportsToAcquireTypeFor } from "./typeAcquisition"; import type * as monaco from "monaco-editor"; +import { detectNewImportsToAcquireTypeFor } from "./typeAcquisition"; -export function acquireTypes(code: string, monacoInstance: typeof monaco) { +function acquireTypes(code: string, monacoInstance: typeof monaco) { detectNewImportsToAcquireTypeFor( code, (code: string, path: string) => { @@ -16,9 +16,9 @@ export function acquireTypes(code: string, monacoInstance: typeof monaco) { ); } -export default function setupNpmTypeResolver(monacoInstance: typeof monaco) { +export function setupNpmTypeResolver(monacoInstance: typeof monaco) { monacoInstance.editor.onDidCreateModel((model) => { - if (!model.uri.path.startsWith("/!@") /*!@*/) { + if (!model.uri.path.startsWith("/!")) { return; } diff --git a/packages/editor/src/runtime/editor/languages/typescript/typeAcquisition.ts b/packages/frame/src/runtime/editor/languages/typescript/typeAcquisition.ts similarity index 92% rename from packages/editor/src/runtime/editor/languages/typescript/typeAcquisition.ts rename to packages/frame/src/runtime/editor/languages/typescript/typeAcquisition.ts index 52a24c061..6f61a91af 100644 --- a/packages/editor/src/runtime/editor/languages/typescript/typeAcquisition.ts +++ b/packages/frame/src/runtime/editor/languages/typescript/typeAcquisition.ts @@ -1,11 +1,15 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ // from https://github.com/microsoft/TypeScript-Website/blob/v2/packages/sandbox/src/typeAcquisition.ts -import lzstring from "lz-string"; +import { CompressedCache } from "./CompressedCache"; const globalishObj: any = typeof globalThis !== "undefined" ? globalThis : window || {}; globalishObj.typeDefinitions = {}; +const cache = new CompressedCache(); + /** * Type Defs we've already got, and nulls when something has failed. * This is to make sure that it doesn't infinite loop. @@ -66,18 +70,24 @@ const parseFileForModuleReferences = ( return []; } const foundModules = new Set(); - var match; + let match; while ((match = es6Pattern.exec(sourceCode)) !== null) { - if (match[6]) foundModules.add(match[6]); + if (match[6]) { + foundModules.add(match[6]); + } } while ((match = requirePattern.exec(sourceCode)) !== null) { - if (match[5]) foundModules.add(match[5]); + if (match[5]) { + foundModules.add(match[5]); + } } while ((match = es6ImportOnly.exec(sourceCode)) !== null) { - if (match[2]) foundModules.add(match[2]); + if (match[2]) { + foundModules.add(match[2]); + } } return Array.from(foundModules); @@ -142,16 +152,23 @@ const mapModuleNameToModule = (name: string) => { const mapRelativePath = (moduleDeclaration: string, currentPath: string) => { // https://stackoverflow.com/questions/14780350/convert-relative-path-to-absolute-using-javascript function absolute(base: string, relative: string) { - if (!base) return relative; + if (!base) { + return relative; + } const stack = base.split("/"); const parts = relative.split("/"); stack.pop(); // remove current file name (or empty string) - for (var i = 0; i < parts.length; i++) { - if (parts[i] === ".") continue; - if (parts[i] === "..") stack.pop(); - else stack.push(parts[i]); + for (let i = 0; i < parts.length; i++) { + if (parts[i] === ".") { + continue; + } + if (parts[i] === "..") { + stack.pop(); + } else { + stack.push(parts[i]); + } } return stack.join("/"); } @@ -172,7 +189,7 @@ const convertToModuleReferenceID = ( moduleDeclaration.split("/").length === 1; const isPackageRootImport = modIsPackageOnly || modIsScopedPackageOnly; - if (moduleDeclaration.startsWith("!@")) { + if (moduleDeclaration.startsWith("!")) { return moduleDeclaration + ".d.ts"; // typecell } else if (isPackageRootImport) { return moduleDeclaration; @@ -196,10 +213,10 @@ const addBuiltInTypesToRuntime = async ( let typePath = mod; if (mod === "typecell") { - typePath = "@typecell-org/editor"; + typePath = "@typecell-org/frame/src"; } else if (isBuiltInModule(mod)) { if (mod === "csstype") { - typePath = "@types/react/node_modules/csstype"; // TODO: would be better to have 1 version of csstype, and in @types/csstype + typePath = "csstype"; } else { typePath = "@types/" + mod; } @@ -212,8 +229,12 @@ const addBuiltInTypesToRuntime = async ( let content: string | void; if (import.meta.env.NODE_ENV === "test") { // TODO: extract this case - let fs = require("fs"); - content = fs.readFileSync("public/types/" + typePath + "/" + path, "utf-8"); + // eslint-disable-next-line @typescript-eslint/no-var-requires + const fs = require("fs"); + content = fs.readFileSync( + "../editor/public/types/" + typePath + "/" + path, + "utf-8" + ); } else { const url = new URL("/types/" + typePath + "/" + path, import.meta.url); // console.log("RESOLVE", mod, url.toString(), path); @@ -389,22 +410,12 @@ const getModuleAndRootDefTypePath = async ( }; const getCachedDTSString = async (config: ATAConfig, url: string) => { - const cached = localStorage.getItem(url); - if (cached) { - const [dateString, text] = cached.split("-=-^-=-"); - const cachedDate = new Date(dateString); - const now = new Date(); - - const cacheTimeout = 604800000; // 1 week - // const cacheTimeout = 60000 // 1 min - if (now.getTime() - cachedDate.getTime() < cacheTimeout) { - return lzstring.decompressFromUTF16(text); - } else { - config.logger.log("Skipping cache for ", url); - } + const cached = await cache.getItem(url); + if (cached) { + return cached; } - + const response = await config.fetcher(url); if (!response.ok) { @@ -420,7 +431,7 @@ const getCachedDTSString = async (config: ATAConfig, url: string) => { config.logger.warn(`possibly wrong file for typescript types at ${url}`); } // TODO: handle checking for a resolve to index.d.ts whens someone imports the folder - let content = await response.text(); + const content = await response.text(); if (!content) { return errorMsg( `Could not get text for DTS response at ${url}`, @@ -429,11 +440,8 @@ const getCachedDTSString = async (config: ATAConfig, url: string) => { ); } - const now = new Date(); - const cacheContent = `${now.toISOString()}-=-^-=-${lzstring.compressToUTF16( - content - )}`; - localStorage.setItem(url, cacheContent); + cache.setItem(url, content); + return content; }; @@ -448,14 +456,14 @@ const getReferenceDependencies = async ( path: string, config: ATAConfig ) => { - var match; + let match; if (sourceCode.indexOf("reference path") > 0) { // https://regex101.com/r/DaOegw/1 while ((match = referencePathExtractionPattern.exec(sourceCode)) !== null) { const relativePath = match[1]; if (relativePath) { - let newPath = mapRelativePath(relativePath, path); + const newPath = mapRelativePath(relativePath, path); if (newPath) { if (isBuiltInModule(mod)) { await addBuiltInTypesToRuntime(mod, newPath, config); @@ -581,7 +589,7 @@ const getDependenciesForModule = async ( !isPackageRootImport && !moduleToDownload.startsWith(".") && moduleToDownload.includes("/"); // absolute path - if (moduleToDownload.startsWith("!@")) { + if (moduleToDownload.startsWith("!")) { // typecell imports are loaded in TypecellTypeResolver return; // config.addLibraryToRuntime(code.dtsCode, moduleToDownload+".d.ts"); @@ -620,10 +628,11 @@ const getDependenciesForModule = async ( } } else { // E.g. import {Component} from "./MyThing" - if (!moduleToDownload || !path) + if (!moduleToDownload || !path) { throw new Error( `No outer module or path for a relative import: ${moduleToDownload}` ); + } const absolutePathForModule = mapRelativePath(moduleToDownload, path); diff --git a/packages/frame/src/runtime/editor/prettier/diff.js b/packages/frame/src/runtime/editor/prettier/diff.js new file mode 100644 index 000000000..72d0509d8 --- /dev/null +++ b/packages/frame/src/runtime/editor/prettier/diff.js @@ -0,0 +1,2391 @@ +/* eslint-disable */ + +/** + * Diff Match and Patch + * Copyright 2018 The diff-match-patch Authors. + * https://github.com/google/diff-match-patch + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @fileoverview Computes the difference between two texts to create a patch. + * Applies the patch onto another text, allowing for errors. + * @author fraser@google.com (Neil Fraser) + */ + +/** + * Class containing the diff, match and patch methods. + * @constructor + */ +var diff_match_patch = function () { + // Defaults. + // Redefine these in your program to override the defaults. + + // Number of seconds to map a diff before giving up (0 for infinity). + this.Diff_Timeout = 1.0; + // Cost of an empty edit operation in terms of edit characters. + this.Diff_EditCost = 4; + // At what point is no match declared (0.0 = perfection, 1.0 = very loose). + this.Match_Threshold = 0.5; + // How far to search for a match (0 = exact location, 1000+ = broad match). + // A match this many characters away from the expected location will add + // 1.0 to the score (0.0 is a perfect match). + this.Match_Distance = 1000; + // When deleting a large block of text (over ~64 characters), how close do + // the contents have to be to match the expected contents. (0.0 = perfection, + // 1.0 = very loose). Note that Match_Threshold controls how closely the + // end points of a delete need to match. + this.Patch_DeleteThreshold = 0.5; + // Chunk size for context length. + this.Patch_Margin = 4; + + // The number of bits in an int. + this.Match_MaxBits = 32; + }; + + // DIFF FUNCTIONS + + /** + * The data structure representing a diff is an array of tuples: + * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']] + * which means: delete 'Hello', add 'Goodbye' and keep ' world.' + */ + var DIFF_DELETE = -1; + var DIFF_INSERT = 1; + var DIFF_EQUAL = 0; + + /** + * Class representing one diff tuple. + * Attempts to look like a two-element array (which is what this used to be). + * @param {number} op Operation, one of: DIFF_DELETE, DIFF_INSERT, DIFF_EQUAL. + * @param {string} text Text to be deleted, inserted, or retained. + * @constructor + */ + diff_match_patch.Diff = function (op, text) { + this[0] = op; + this[1] = text; + }; + + diff_match_patch.Diff.prototype.length = 2; + + /** + * Emulate the output of a two-element array. + * @return {string} Diff operation as a string. + */ + diff_match_patch.Diff.prototype.toString = function () { + return this[0] + "," + this[1]; + }; + + /** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean=} opt_checklines Optional speedup flag. If present and false, + * then don't run a line-level diff first to identify the changed areas. + * Defaults to true, which does a faster, slightly less optimal diff. + * @param {number=} opt_deadline Optional time when the diff should be complete + * by. Used internally for recursive calls. Users should set DiffTimeout + * instead. + * @return {!Array.} Array of diff tuples. + */ + diff_match_patch.prototype.diff_main = function ( + text1, + text2, + opt_checklines, + opt_deadline + ) { + // Set a deadline by which time the diff must be complete. + if (typeof opt_deadline == "undefined") { + if (this.Diff_Timeout <= 0) { + opt_deadline = Number.MAX_VALUE; + } else { + opt_deadline = new Date().getTime() + this.Diff_Timeout * 1000; + } + } + var deadline = opt_deadline; + + // Check for null inputs. + if (text1 == null || text2 == null) { + throw new Error("Null input. (diff_main)"); + } + + // Check for equality (speedup). + if (text1 == text2) { + if (text1) { + return [new diff_match_patch.Diff(DIFF_EQUAL, text1)]; + } + return []; + } + + if (typeof opt_checklines == "undefined") { + opt_checklines = true; + } + var checklines = opt_checklines; + + // Trim off common prefix (speedup). + var commonlength = this.diff_commonPrefix(text1, text2); + var commonprefix = text1.substring(0, commonlength); + text1 = text1.substring(commonlength); + text2 = text2.substring(commonlength); + + // Trim off common suffix (speedup). + commonlength = this.diff_commonSuffix(text1, text2); + var commonsuffix = text1.substring(text1.length - commonlength); + text1 = text1.substring(0, text1.length - commonlength); + text2 = text2.substring(0, text2.length - commonlength); + + // Compute the diff on the middle block. + var diffs = this.diff_compute_(text1, text2, checklines, deadline); + + // Restore the prefix and suffix. + if (commonprefix) { + diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, commonprefix)); + } + if (commonsuffix) { + diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, commonsuffix)); + } + this.diff_cleanupMerge(diffs); + return diffs; + }; + + /** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean} checklines Speedup flag. If false, then don't run a + * line-level diff first to identify the changed areas. + * If true, then run a faster, slightly less optimal diff. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + diff_match_patch.prototype.diff_compute_ = function ( + text1, + text2, + checklines, + deadline + ) { + var diffs; + + if (!text1) { + // Just add some text (speedup). + return [new diff_match_patch.Diff(DIFF_INSERT, text2)]; + } + + if (!text2) { + // Just delete some text (speedup). + return [new diff_match_patch.Diff(DIFF_DELETE, text1)]; + } + + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + var i = longtext.indexOf(shorttext); + if (i != -1) { + // Shorter text is inside the longer text (speedup). + diffs = [ + new diff_match_patch.Diff(DIFF_INSERT, longtext.substring(0, i)), + new diff_match_patch.Diff(DIFF_EQUAL, shorttext), + new diff_match_patch.Diff( + DIFF_INSERT, + longtext.substring(i + shorttext.length) + ), + ]; + // Swap insertions for deletions if diff is reversed. + if (text1.length > text2.length) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if (shorttext.length == 1) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [ + new diff_match_patch.Diff(DIFF_DELETE, text1), + new diff_match_patch.Diff(DIFF_INSERT, text2), + ]; + } + + // Check to see if the problem can be split in two. + var hm = this.diff_halfMatch_(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + var text1_a = hm[0]; + var text1_b = hm[1]; + var text2_a = hm[2]; + var text2_b = hm[3]; + var mid_common = hm[4]; + // Send both pairs off for separate processing. + var diffs_a = this.diff_main(text1_a, text2_a, checklines, deadline); + var diffs_b = this.diff_main(text1_b, text2_b, checklines, deadline); + // Merge the results. + return diffs_a.concat( + [new diff_match_patch.Diff(DIFF_EQUAL, mid_common)], + diffs_b + ); + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diff_lineMode_(text1, text2, deadline); + } + + return this.diff_bisect_(text1, text2, deadline); + }; + + /** + * Do a quick line-level diff on both strings, then rediff the parts for + * greater accuracy. + * This speedup can produce non-minimal diffs. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + diff_match_patch.prototype.diff_lineMode_ = function (text1, text2, deadline) { + // Scan the text on a line-by-line basis first. + var a = this.diff_linesToChars_(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + var linearray = a.lineArray; + + var diffs = this.diff_main(text1, text2, false, deadline); + + // Convert the diff back to original text. + this.diff_charsToLines_(diffs, linearray); + // Eliminate freak matches (e.g. blank lines) + this.diff_cleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, "")); + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ""; + var text_insert = ""; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + count_insert++; + text_insert += diffs[pointer][1]; + break; + case DIFF_DELETE: + count_delete++; + text_delete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (count_delete >= 1 && count_insert >= 1) { + // Delete the offending records and add the merged ones. + diffs.splice( + pointer - count_delete - count_insert, + count_delete + count_insert + ); + pointer = pointer - count_delete - count_insert; + var subDiff = this.diff_main( + text_delete, + text_insert, + false, + deadline + ); + for (var j = subDiff.length - 1; j >= 0; j--) { + diffs.splice(pointer, 0, subDiff[j]); + } + pointer = pointer + subDiff.length; + } + count_insert = 0; + count_delete = 0; + text_delete = ""; + text_insert = ""; + break; + } + pointer++; + } + diffs.pop(); // Remove the dummy entry at the end. + + return diffs; + }; + + /** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + diff_match_patch.prototype.diff_bisect_ = function (text1, text2, deadline) { + // Cache the text lengths to prevent multiple calls. + var text1_length = text1.length; + var text2_length = text2.length; + var max_d = Math.ceil((text1_length + text2_length) / 2); + var v_offset = max_d; + var v_length = 2 * max_d; + var v1 = new Array(v_length); + var v2 = new Array(v_length); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (var x = 0; x < v_length; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[v_offset + 1] = 0; + v2[v_offset + 1] = 0; + var delta = text1_length - text2_length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + var front = delta % 2 != 0; + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + var k1start = 0; + var k1end = 0; + var k2start = 0; + var k2end = 0; + for (var d = 0; d < max_d; d++) { + // Bail out if deadline is reached. + if (new Date().getTime() > deadline) { + break; + } + + // Walk the front path one step. + for (var k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + var k1_offset = v_offset + k1; + var x1; + if (k1 == -d || (k1 != d && v1[k1_offset - 1] < v1[k1_offset + 1])) { + x1 = v1[k1_offset + 1]; + } else { + x1 = v1[k1_offset - 1] + 1; + } + var y1 = x1 - k1; + while ( + x1 < text1_length && + y1 < text2_length && + text1.charAt(x1) == text2.charAt(y1) + ) { + x1++; + y1++; + } + v1[k1_offset] = x1; + if (x1 > text1_length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2_length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + var k2_offset = v_offset + delta - k1; + if (k2_offset >= 0 && k2_offset < v_length && v2[k2_offset] != -1) { + // Mirror x2 onto top-left coordinate system. + var x2 = text1_length - v2[k2_offset]; + if (x1 >= x2) { + // Overlap detected. + return this.diff_bisectSplit_(text1, text2, x1, y1, deadline); + } + } + } + } + + // Walk the reverse path one step. + for (var k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + var k2_offset = v_offset + k2; + var x2; + if (k2 == -d || (k2 != d && v2[k2_offset - 1] < v2[k2_offset + 1])) { + x2 = v2[k2_offset + 1]; + } else { + x2 = v2[k2_offset - 1] + 1; + } + var y2 = x2 - k2; + while ( + x2 < text1_length && + y2 < text2_length && + text1.charAt(text1_length - x2 - 1) == + text2.charAt(text2_length - y2 - 1) + ) { + x2++; + y2++; + } + v2[k2_offset] = x2; + if (x2 > text1_length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2_length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + var k1_offset = v_offset + delta - k2; + if (k1_offset >= 0 && k1_offset < v_length && v1[k1_offset] != -1) { + var x1 = v1[k1_offset]; + var y1 = v_offset + x1 - k1_offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1_length - x2; + if (x1 >= x2) { + // Overlap detected. + return this.diff_bisectSplit_(text1, text2, x1, y1, deadline); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [ + new diff_match_patch.Diff(DIFF_DELETE, text1), + new diff_match_patch.Diff(DIFF_INSERT, text2), + ]; + }; + + /** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + diff_match_patch.prototype.diff_bisectSplit_ = function ( + text1, + text2, + x, + y, + deadline + ) { + var text1a = text1.substring(0, x); + var text2a = text2.substring(0, y); + var text1b = text1.substring(x); + var text2b = text2.substring(y); + + // Compute both diffs serially. + var diffs = this.diff_main(text1a, text2a, false, deadline); + var diffsb = this.diff_main(text1b, text2b, false, deadline); + + return diffs.concat(diffsb); + }; + + /** + * Split two texts into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {{chars1: string, chars2: string, lineArray: !Array.}} + * An object containing the encoded text1, the encoded text2 and + * the array of unique strings. + * The zeroth element of the array of unique strings is intentionally blank. + * @private + */ + diff_match_patch.prototype.diff_linesToChars_ = function (text1, text2) { + var lineArray = []; // e.g. lineArray[4] == 'Hello\n' + var lineHash = {}; // e.g. lineHash['Hello\n'] == 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray[0] = ""; + + /** + * Split a text into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * Modifies linearray and linehash through being a closure. + * @param {string} text String to encode. + * @return {string} Encoded string. + * @private + */ + function diff_linesToCharsMunge_(text) { + var chars = ""; + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + var lineStart = 0; + var lineEnd = -1; + // Keeping our own length variable is faster than looking it up. + var lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf("\n", lineStart); + if (lineEnd == -1) { + lineEnd = text.length - 1; + } + var line = text.substring(lineStart, lineEnd + 1); + + if ( + lineHash.hasOwnProperty + ? lineHash.hasOwnProperty(line) + : lineHash[line] !== undefined + ) { + chars += String.fromCharCode(lineHash[line]); + } else { + if (lineArrayLength == maxLines) { + // Bail out at 65535 because + // String.fromCharCode(65536) == String.fromCharCode(0) + line = text.substring(lineStart); + lineEnd = text.length; + } + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + lineStart = lineEnd + 1; + } + return chars; + } + // Allocate 2/3rds of the space for text1, the rest for text2. + var maxLines = 40000; + var chars1 = diff_linesToCharsMunge_(text1); + maxLines = 65535; + var chars2 = diff_linesToCharsMunge_(text2); + return { chars1: chars1, chars2: chars2, lineArray: lineArray }; + }; + + /** + * Rehydrate the text in a diff from a string of line hashes to real lines of + * text. + * @param {!Array.} diffs Array of diff tuples. + * @param {!Array.} lineArray Array of unique strings. + * @private + */ + diff_match_patch.prototype.diff_charsToLines_ = function (diffs, lineArray) { + for (var i = 0; i < diffs.length; i++) { + var chars = diffs[i][1]; + var text = []; + for (var j = 0; j < chars.length; j++) { + text[j] = lineArray[chars.charCodeAt(j)]; + } + diffs[i][1] = text.join(""); + } + }; + + /** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ + diff_match_patch.prototype.diff_commonPrefix = function (text1, text2) { + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(0) != text2.charAt(0)) { + return 0; + } + // Binary search. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerstart = 0; + while (pointermin < pointermid) { + if ( + text1.substring(pointerstart, pointermid) == + text2.substring(pointerstart, pointermid) + ) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + + /** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ + diff_match_patch.prototype.diff_commonSuffix = function (text1, text2) { + // Quick check for common null cases. + if ( + !text1 || + !text2 || + text1.charAt(text1.length - 1) != text2.charAt(text2.length - 1) + ) { + return 0; + } + // Binary search. + // Performance analysis: https://neil.fraser.name/news/2007/10/09/ + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + var pointerend = 0; + while (pointermin < pointermid) { + if ( + text1.substring(text1.length - pointermid, text1.length - pointerend) == + text2.substring(text2.length - pointermid, text2.length - pointerend) + ) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + return pointermid; + }; + + /** + * Determine if the suffix of one string is the prefix of another. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of the first + * string and the start of the second string. + * @private + */ + diff_match_patch.prototype.diff_commonOverlap_ = function (text1, text2) { + // Cache the text lengths to prevent multiple calls. + var text1_length = text1.length; + var text2_length = text2.length; + // Eliminate the null case. + if (text1_length == 0 || text2_length == 0) { + return 0; + } + // Truncate the longer string. + if (text1_length > text2_length) { + text1 = text1.substring(text1_length - text2_length); + } else if (text1_length < text2_length) { + text2 = text2.substring(0, text1_length); + } + var text_length = Math.min(text1_length, text2_length); + // Quick check for the worst case. + if (text1 == text2) { + return text_length; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: https://neil.fraser.name/news/2010/11/04/ + var best = 0; + var length = 1; + while (true) { + var pattern = text1.substring(text_length - length); + var found = text2.indexOf(pattern); + if (found == -1) { + return best; + } + length += found; + if ( + found == 0 || + text1.substring(text_length - length) == text2.substring(0, length) + ) { + best = length; + length++; + } + } + }; + + /** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + * @private + */ + diff_match_patch.prototype.diff_halfMatch_ = function (text1, text2) { + if (this.Diff_Timeout <= 0) { + // Don't risk returning a non-optimal diff if we have unlimited time. + return null; + } + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + var dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diff_halfMatchI_(longtext, shorttext, i) { + // Start with a 1/4 length substring at position i as a seed. + var seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + var j = -1; + var best_common = ""; + var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; + while ((j = shorttext.indexOf(seed, j + 1)) != -1) { + var prefixLength = dmp.diff_commonPrefix( + longtext.substring(i), + shorttext.substring(j) + ); + var suffixLength = dmp.diff_commonSuffix( + longtext.substring(0, i), + shorttext.substring(0, j) + ); + if (best_common.length < suffixLength + prefixLength) { + best_common = + shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + best_longtext_a = longtext.substring(0, i - suffixLength); + best_longtext_b = longtext.substring(i + prefixLength); + best_shorttext_a = shorttext.substring(0, j - suffixLength); + best_shorttext_b = shorttext.substring(j + prefixLength); + } + } + if (best_common.length * 2 >= longtext.length) { + return [ + best_longtext_a, + best_longtext_b, + best_shorttext_a, + best_shorttext_b, + best_common, + ]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + var hm1 = diff_halfMatchI_( + longtext, + shorttext, + Math.ceil(longtext.length / 4) + ); + // Check again based on the third quarter. + var hm2 = diff_halfMatchI_( + longtext, + shorttext, + Math.ceil(longtext.length / 2) + ); + var hm; + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + var text1_a, text1_b, text2_a, text2_b; + if (text1.length > text2.length) { + text1_a = hm[0]; + text1_b = hm[1]; + text2_a = hm[2]; + text2_b = hm[3]; + } else { + text2_a = hm[0]; + text2_b = hm[1]; + text1_a = hm[2]; + text1_b = hm[3]; + } + var mid_common = hm[4]; + return [text1_a, text1_b, text2_a, text2_b, mid_common]; + }; + + /** + * Reduce the number of edits by eliminating semantically trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + diff_match_patch.prototype.diff_cleanupSemantic = function (diffs) { + var changes = false; + var equalities = []; // Stack of indices where equalities are found. + var equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + var lastEquality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + var pointer = 0; // Index of current position. + // Number of characters that changed prior to the equality. + var length_insertions1 = 0; + var length_deletions1 = 0; + // Number of characters that changed after the equality. + var length_insertions2 = 0; + var length_deletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] == DIFF_EQUAL) { + // Equality found. + equalities[equalitiesLength++] = pointer; + length_insertions1 = length_insertions2; + length_deletions1 = length_deletions2; + length_insertions2 = 0; + length_deletions2 = 0; + lastEquality = diffs[pointer][1]; + } else { + // An insertion or deletion. + if (diffs[pointer][0] == DIFF_INSERT) { + length_insertions2 += diffs[pointer][1].length; + } else { + length_deletions2 += diffs[pointer][1].length; + } + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if ( + lastEquality && + lastEquality.length <= + Math.max(length_insertions1, length_deletions1) && + lastEquality.length <= Math.max(length_insertions2, length_deletions2) + ) { + // Duplicate record. + diffs.splice( + equalities[equalitiesLength - 1], + 0, + new diff_match_patch.Diff(DIFF_DELETE, lastEquality) + ); + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + // Throw away the equality we just deleted. + equalitiesLength--; + // Throw away the previous equality (it needs to be reevaluated). + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + length_insertions1 = 0; // Reset the counters. + length_deletions1 = 0; + length_insertions2 = 0; + length_deletions2 = 0; + lastEquality = null; + changes = true; + } + } + pointer++; + } + + // Normalize the diff. + if (changes) { + this.diff_cleanupMerge(diffs); + } + this.diff_cleanupSemanticLossless(diffs); + + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if ( + diffs[pointer - 1][0] == DIFF_DELETE && + diffs[pointer][0] == DIFF_INSERT + ) { + var deletion = diffs[pointer - 1][1]; + var insertion = diffs[pointer][1]; + var overlap_length1 = this.diff_commonOverlap_(deletion, insertion); + var overlap_length2 = this.diff_commonOverlap_(insertion, deletion); + if (overlap_length1 >= overlap_length2) { + if ( + overlap_length1 >= deletion.length / 2 || + overlap_length1 >= insertion.length / 2 + ) { + // Overlap found. Insert an equality and trim the surrounding edits. + diffs.splice( + pointer, + 0, + new diff_match_patch.Diff( + DIFF_EQUAL, + insertion.substring(0, overlap_length1) + ) + ); + diffs[pointer - 1][1] = deletion.substring( + 0, + deletion.length - overlap_length1 + ); + diffs[pointer + 1][1] = insertion.substring(overlap_length1); + pointer++; + } + } else { + if ( + overlap_length2 >= deletion.length / 2 || + overlap_length2 >= insertion.length / 2 + ) { + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.splice( + pointer, + 0, + new diff_match_patch.Diff( + DIFF_EQUAL, + deletion.substring(0, overlap_length2) + ) + ); + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = insertion.substring( + 0, + insertion.length - overlap_length2 + ); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = deletion.substring(overlap_length2); + pointer++; + } + } + pointer++; + } + pointer++; + } + }; + + /** + * Look for single edits surrounded on both sides by equalities + * which can be shifted sideways to align the edit to a word boundary. + * e.g: The cat came. -> The cat came. + * @param {!Array.} diffs Array of diff tuples. + */ + diff_match_patch.prototype.diff_cleanupSemanticLossless = function (diffs) { + /** + * Given two strings, compute a score representing whether the internal + * boundary falls on logical boundaries. + * Scores range from 6 (best) to 0 (worst). + * Closure, but does not reference any external variables. + * @param {string} one First string. + * @param {string} two Second string. + * @return {number} The score. + * @private + */ + function diff_cleanupSemanticScore_(one, two) { + if (!one || !two) { + // Edges are the best. + return 6; + } + + // Each port of this function behaves slightly differently due to + // subtle differences in each language's definition of things like + // 'whitespace'. Since this function's purpose is largely cosmetic, + // the choice has been made to use each language's native features + // rather than force total conformity. + var char1 = one.charAt(one.length - 1); + var char2 = two.charAt(0); + var nonAlphaNumeric1 = char1.match(diff_match_patch.nonAlphaNumericRegex_); + var nonAlphaNumeric2 = char2.match(diff_match_patch.nonAlphaNumericRegex_); + var whitespace1 = + nonAlphaNumeric1 && char1.match(diff_match_patch.whitespaceRegex_); + var whitespace2 = + nonAlphaNumeric2 && char2.match(diff_match_patch.whitespaceRegex_); + var lineBreak1 = + whitespace1 && char1.match(diff_match_patch.linebreakRegex_); + var lineBreak2 = + whitespace2 && char2.match(diff_match_patch.linebreakRegex_); + var blankLine1 = + lineBreak1 && one.match(diff_match_patch.blanklineEndRegex_); + var blankLine2 = + lineBreak2 && two.match(diff_match_patch.blanklineStartRegex_); + + if (blankLine1 || blankLine2) { + // Five points for blank lines. + return 5; + } else if (lineBreak1 || lineBreak2) { + // Four points for line breaks. + return 4; + } else if (nonAlphaNumeric1 && !whitespace1 && whitespace2) { + // Three points for end of sentences. + return 3; + } else if (whitespace1 || whitespace2) { + // Two points for whitespace. + return 2; + } else if (nonAlphaNumeric1 || nonAlphaNumeric2) { + // One point for non-alphanumeric. + return 1; + } + return 0; + } + + var pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if ( + diffs[pointer - 1][0] == DIFF_EQUAL && + diffs[pointer + 1][0] == DIFF_EQUAL + ) { + // This is a single edit surrounded by equalities. + var equality1 = diffs[pointer - 1][1]; + var edit = diffs[pointer][1]; + var equality2 = diffs[pointer + 1][1]; + + // First, shift the edit as far left as possible. + var commonOffset = this.diff_commonSuffix(equality1, edit); + if (commonOffset) { + var commonString = edit.substring(edit.length - commonOffset); + equality1 = equality1.substring(0, equality1.length - commonOffset); + edit = commonString + edit.substring(0, edit.length - commonOffset); + equality2 = commonString + equality2; + } + + // Second, step character by character right, looking for the best fit. + var bestEquality1 = equality1; + var bestEdit = edit; + var bestEquality2 = equality2; + var bestScore = + diff_cleanupSemanticScore_(equality1, edit) + + diff_cleanupSemanticScore_(edit, equality2); + while (edit.charAt(0) === equality2.charAt(0)) { + equality1 += edit.charAt(0); + edit = edit.substring(1) + equality2.charAt(0); + equality2 = equality2.substring(1); + var score = + diff_cleanupSemanticScore_(equality1, edit) + + diff_cleanupSemanticScore_(edit, equality2); + // The >= encourages trailing rather than leading whitespace on edits. + if (score >= bestScore) { + bestScore = score; + bestEquality1 = equality1; + bestEdit = edit; + bestEquality2 = equality2; + } + } + + if (diffs[pointer - 1][1] != bestEquality1) { + // We have an improvement, save it back to the diff. + if (bestEquality1) { + diffs[pointer - 1][1] = bestEquality1; + } else { + diffs.splice(pointer - 1, 1); + pointer--; + } + diffs[pointer][1] = bestEdit; + if (bestEquality2) { + diffs[pointer + 1][1] = bestEquality2; + } else { + diffs.splice(pointer + 1, 1); + pointer--; + } + } + } + pointer++; + } + }; + + // Define some regex patterns for matching boundaries. + diff_match_patch.nonAlphaNumericRegex_ = /[^a-zA-Z0-9]/; + diff_match_patch.whitespaceRegex_ = /\s/; + diff_match_patch.linebreakRegex_ = /[\r\n]/; + diff_match_patch.blanklineEndRegex_ = /\n\r?\n$/; + diff_match_patch.blanklineStartRegex_ = /^\r?\n\r?\n/; + + /** + * Reduce the number of edits by eliminating operationally trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + diff_match_patch.prototype.diff_cleanupEfficiency = function (diffs) { + var changes = false; + var equalities = []; // Stack of indices where equalities are found. + var equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + var lastEquality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + var pointer = 0; // Index of current position. + // Is there an insertion operation before the last equality. + var pre_ins = false; + // Is there a deletion operation before the last equality. + var pre_del = false; + // Is there an insertion operation after the last equality. + var post_ins = false; + // Is there a deletion operation after the last equality. + var post_del = false; + while (pointer < diffs.length) { + if (diffs[pointer][0] == DIFF_EQUAL) { + // Equality found. + if ( + diffs[pointer][1].length < this.Diff_EditCost && + (post_ins || post_del) + ) { + // Candidate found. + equalities[equalitiesLength++] = pointer; + pre_ins = post_ins; + pre_del = post_del; + lastEquality = diffs[pointer][1]; + } else { + // Not a candidate, and can never become one. + equalitiesLength = 0; + lastEquality = null; + } + post_ins = post_del = false; + } else { + // An insertion or deletion. + if (diffs[pointer][0] == DIFF_DELETE) { + post_del = true; + } else { + post_ins = true; + } + /* + * Five types to be split: + * ABXYCD + * AXCD + * ABXC + * AXCD + * ABXC + */ + if ( + lastEquality && + ((pre_ins && pre_del && post_ins && post_del) || + (lastEquality.length < this.Diff_EditCost / 2 && + pre_ins + pre_del + post_ins + post_del == 3)) + ) { + // Duplicate record. + diffs.splice( + equalities[equalitiesLength - 1], + 0, + new diff_match_patch.Diff(DIFF_DELETE, lastEquality) + ); + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + equalitiesLength--; // Throw away the equality we just deleted; + lastEquality = null; + if (pre_ins && pre_del) { + // No changes made which could affect previous entry, keep going. + post_ins = post_del = true; + equalitiesLength = 0; + } else { + equalitiesLength--; // Throw away the previous equality. + pointer = + equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + post_ins = post_del = false; + } + changes = true; + } + } + pointer++; + } + + if (changes) { + this.diff_cleanupMerge(diffs); + } + }; + + /** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {!Array.} diffs Array of diff tuples. + */ + diff_match_patch.prototype.diff_cleanupMerge = function (diffs) { + // Add a dummy entry at the end. + diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, "")); + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ""; + var text_insert = ""; + var commonlength; + while (pointer < diffs.length) { + switch (diffs[pointer][0]) { + case DIFF_INSERT: + count_insert++; + text_insert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + count_delete++; + text_delete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (count_delete + count_insert > 1) { + if (count_delete !== 0 && count_insert !== 0) { + // Factor out any common prefixies. + commonlength = this.diff_commonPrefix(text_insert, text_delete); + if (commonlength !== 0) { + if ( + pointer - count_delete - count_insert > 0 && + diffs[pointer - count_delete - count_insert - 1][0] == + DIFF_EQUAL + ) { + diffs[pointer - count_delete - count_insert - 1][1] += + text_insert.substring(0, commonlength); + } else { + diffs.splice( + 0, + 0, + new diff_match_patch.Diff( + DIFF_EQUAL, + text_insert.substring(0, commonlength) + ) + ); + pointer++; + } + text_insert = text_insert.substring(commonlength); + text_delete = text_delete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = this.diff_commonSuffix(text_insert, text_delete); + if (commonlength !== 0) { + diffs[pointer][1] = + text_insert.substring(text_insert.length - commonlength) + + diffs[pointer][1]; + text_insert = text_insert.substring( + 0, + text_insert.length - commonlength + ); + text_delete = text_delete.substring( + 0, + text_delete.length - commonlength + ); + } + } + // Delete the offending records and add the merged ones. + pointer -= count_delete + count_insert; + diffs.splice(pointer, count_delete + count_insert); + if (text_delete.length) { + diffs.splice( + pointer, + 0, + new diff_match_patch.Diff(DIFF_DELETE, text_delete) + ); + pointer++; + } + if (text_insert.length) { + diffs.splice( + pointer, + 0, + new diff_match_patch.Diff(DIFF_INSERT, text_insert) + ); + pointer++; + } + pointer++; + } else if (pointer !== 0 && diffs[pointer - 1][0] == DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + count_insert = 0; + count_delete = 0; + text_delete = ""; + text_insert = ""; + break; + } + } + if (diffs[diffs.length - 1][1] === "") { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + var changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if ( + diffs[pointer - 1][0] == DIFF_EQUAL && + diffs[pointer + 1][0] == DIFF_EQUAL + ) { + // This is a single edit surrounded by equalities. + if ( + diffs[pointer][1].substring( + diffs[pointer][1].length - diffs[pointer - 1][1].length + ) == diffs[pointer - 1][1] + ) { + // Shift the edit over the previous equality. + diffs[pointer][1] = + diffs[pointer - 1][1] + + diffs[pointer][1].substring( + 0, + diffs[pointer][1].length - diffs[pointer - 1][1].length + ); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if ( + diffs[pointer][1].substring(0, diffs[pointer + 1][1].length) == + diffs[pointer + 1][1] + ) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + this.diff_cleanupMerge(diffs); + } + }; + + /** + * loc is a location in text1, compute and return the equivalent location in + * text2. + * e.g. 'The cat' vs 'The big cat', 1->1, 5->8 + * @param {!Array.} diffs Array of diff tuples. + * @param {number} loc Location within text1. + * @return {number} Location within text2. + */ + diff_match_patch.prototype.diff_xIndex = function (diffs, loc) { + var chars1 = 0; + var chars2 = 0; + var last_chars1 = 0; + var last_chars2 = 0; + var x; + for (x = 0; x < diffs.length; x++) { + if (diffs[x][0] !== DIFF_INSERT) { + // Equality or deletion. + chars1 += diffs[x][1].length; + } + if (diffs[x][0] !== DIFF_DELETE) { + // Equality or insertion. + chars2 += diffs[x][1].length; + } + if (chars1 > loc) { + // Overshot the location. + break; + } + last_chars1 = chars1; + last_chars2 = chars2; + } + // Was the location was deleted? + if (diffs.length != x && diffs[x][0] === DIFF_DELETE) { + return last_chars2; + } + // Add the remaining character length. + return last_chars2 + (loc - last_chars1); + }; + + /** + * Convert a diff array into a pretty HTML report. + * @param {!Array.} diffs Array of diff tuples. + * @return {string} HTML representation. + */ + diff_match_patch.prototype.diff_prettyHtml = function (diffs) { + var html = []; + var pattern_amp = /&/g; + var pattern_lt = //g; + var pattern_para = /\n/g; + for (var x = 0; x < diffs.length; x++) { + var op = diffs[x][0]; // Operation (insert, delete, equal) + var data = diffs[x][1]; // Text of change. + var text = data + .replace(pattern_amp, "&") + .replace(pattern_lt, "<") + .replace(pattern_gt, ">") + .replace(pattern_para, "¶
"); + switch (op) { + case DIFF_INSERT: + html[x] = '' + text + ""; + break; + case DIFF_DELETE: + html[x] = '' + text + ""; + break; + case DIFF_EQUAL: + html[x] = "" + text + ""; + break; + } + } + return html.join(""); + }; + + /** + * Compute and return the source text (all equalities and deletions). + * @param {!Array.} diffs Array of diff tuples. + * @return {string} Source text. + */ + diff_match_patch.prototype.diff_text1 = function (diffs) { + var text = []; + for (var x = 0; x < diffs.length; x++) { + if (diffs[x][0] !== DIFF_INSERT) { + text[x] = diffs[x][1]; + } + } + return text.join(""); + }; + + /** + * Compute and return the destination text (all equalities and insertions). + * @param {!Array.} diffs Array of diff tuples. + * @return {string} Destination text. + */ + diff_match_patch.prototype.diff_text2 = function (diffs) { + var text = []; + for (var x = 0; x < diffs.length; x++) { + if (diffs[x][0] !== DIFF_DELETE) { + text[x] = diffs[x][1]; + } + } + return text.join(""); + }; + + /** + * Compute the Levenshtein distance; the number of inserted, deleted or + * substituted characters. + * @param {!Array.} diffs Array of diff tuples. + * @return {number} Number of changes. + */ + diff_match_patch.prototype.diff_levenshtein = function (diffs) { + var levenshtein = 0; + var insertions = 0; + var deletions = 0; + for (var x = 0; x < diffs.length; x++) { + var op = diffs[x][0]; + var data = diffs[x][1]; + switch (op) { + case DIFF_INSERT: + insertions += data.length; + break; + case DIFF_DELETE: + deletions += data.length; + break; + case DIFF_EQUAL: + // A deletion and an insertion is one substitution. + levenshtein += Math.max(insertions, deletions); + insertions = 0; + deletions = 0; + break; + } + } + levenshtein += Math.max(insertions, deletions); + return levenshtein; + }; + + /** + * Crush the diff into an encoded string which describes the operations + * required to transform text1 into text2. + * E.g. =3\t-2\t+ing -> Keep 3 chars, delete 2 chars, insert 'ing'. + * Operations are tab-separated. Inserted text is escaped using %xx notation. + * @param {!Array.} diffs Array of diff tuples. + * @return {string} Delta text. + */ + diff_match_patch.prototype.diff_toDelta = function (diffs) { + var text = []; + for (var x = 0; x < diffs.length; x++) { + switch (diffs[x][0]) { + case DIFF_INSERT: + text[x] = "+" + encodeURI(diffs[x][1]); + break; + case DIFF_DELETE: + text[x] = "-" + diffs[x][1].length; + break; + case DIFF_EQUAL: + text[x] = "=" + diffs[x][1].length; + break; + } + } + return text.join("\t").replace(/%20/g, " "); + }; + + /** + * Given the original text1, and an encoded string which describes the + * operations required to transform text1 into text2, compute the full diff. + * @param {string} text1 Source string for the diff. + * @param {string} delta Delta text. + * @return {!Array.} Array of diff tuples. + * @throws {!Error} If invalid input. + */ + diff_match_patch.prototype.diff_fromDelta = function (text1, delta) { + var diffs = []; + var diffsLength = 0; // Keeping our own length var is faster in JS. + var pointer = 0; // Cursor in text1 + var tokens = delta.split(/\t/g); + for (var x = 0; x < tokens.length; x++) { + // Each token begins with a one character parameter which specifies the + // operation of this token (delete, insert, equality). + var param = tokens[x].substring(1); + switch (tokens[x].charAt(0)) { + case "+": + try { + diffs[diffsLength++] = new diff_match_patch.Diff( + DIFF_INSERT, + decodeURI(param) + ); + } catch (ex) { + // Malformed URI sequence. + throw new Error("Illegal escape in diff_fromDelta: " + param); + } + break; + case "-": + // Fall through. + case "=": + var n = parseInt(param, 10); + if (isNaN(n) || n < 0) { + throw new Error("Invalid number in diff_fromDelta: " + param); + } + var text = text1.substring(pointer, (pointer += n)); + if (tokens[x].charAt(0) == "=") { + diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_EQUAL, text); + } else { + diffs[diffsLength++] = new diff_match_patch.Diff(DIFF_DELETE, text); + } + break; + default: + // Blank tokens are ok (from a trailing \t). + // Anything else is an error. + if (tokens[x]) { + throw new Error( + "Invalid diff operation in diff_fromDelta: " + tokens[x] + ); + } + } + } + if (pointer != text1.length) { + throw new Error( + "Delta length (" + + pointer + + ") does not equal source text length (" + + text1.length + + ")." + ); + } + return diffs; + }; + + // MATCH FUNCTIONS + + /** + * Locate the best instance of 'pattern' in 'text' near 'loc'. + * @param {string} text The text to search. + * @param {string} pattern The pattern to search for. + * @param {number} loc The location to search around. + * @return {number} Best match index or -1. + */ + diff_match_patch.prototype.match_main = function (text, pattern, loc) { + // Check for null inputs. + if (text == null || pattern == null || loc == null) { + throw new Error("Null input. (match_main)"); + } + + loc = Math.max(0, Math.min(loc, text.length)); + if (text == pattern) { + // Shortcut (potentially not guaranteed by the algorithm) + return 0; + } else if (!text.length) { + // Nothing to match. + return -1; + } else if (text.substring(loc, loc + pattern.length) == pattern) { + // Perfect match at the perfect spot! (Includes case of null pattern) + return loc; + } else { + // Do a fuzzy compare. + return this.match_bitap_(text, pattern, loc); + } + }; + + /** + * Locate the best instance of 'pattern' in 'text' near 'loc' using the + * Bitap algorithm. + * @param {string} text The text to search. + * @param {string} pattern The pattern to search for. + * @param {number} loc The location to search around. + * @return {number} Best match index or -1. + * @private + */ + diff_match_patch.prototype.match_bitap_ = function (text, pattern, loc) { + if (pattern.length > this.Match_MaxBits) { + throw new Error("Pattern too long for this browser."); + } + + // Initialise the alphabet. + var s = this.match_alphabet_(pattern); + + var dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Compute and return the score for a match with e errors and x location. + * Accesses loc and pattern through being a closure. + * @param {number} e Number of errors in match. + * @param {number} x Location of match. + * @return {number} Overall score for match (0.0 = good, 1.0 = bad). + * @private + */ + function match_bitapScore_(e, x) { + var accuracy = e / pattern.length; + var proximity = Math.abs(loc - x); + if (!dmp.Match_Distance) { + // Dodge divide by zero error. + return proximity ? 1.0 : accuracy; + } + return accuracy + proximity / dmp.Match_Distance; + } + + // Highest score beyond which we give up. + var score_threshold = this.Match_Threshold; + // Is there a nearby exact match? (speedup) + var best_loc = text.indexOf(pattern, loc); + if (best_loc != -1) { + score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold); + // What about in the other direction? (speedup) + best_loc = text.lastIndexOf(pattern, loc + pattern.length); + if (best_loc != -1) { + score_threshold = Math.min( + match_bitapScore_(0, best_loc), + score_threshold + ); + } + } + + // Initialise the bit arrays. + var matchmask = 1 << (pattern.length - 1); + best_loc = -1; + + var bin_min, bin_mid; + var bin_max = pattern.length + text.length; + var last_rd; + for (var d = 0; d < pattern.length; d++) { + // Scan for the best match; each iteration allows for one more error. + // Run a binary search to determine how far from 'loc' we can stray at this + // error level. + bin_min = 0; + bin_mid = bin_max; + while (bin_min < bin_mid) { + if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) { + bin_min = bin_mid; + } else { + bin_max = bin_mid; + } + bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min); + } + // Use the result from this iteration as the maximum for the next. + bin_max = bin_mid; + var start = Math.max(1, loc - bin_mid + 1); + var finish = Math.min(loc + bin_mid, text.length) + pattern.length; + + var rd = Array(finish + 2); + rd[finish + 1] = (1 << d) - 1; + for (var j = finish; j >= start; j--) { + // The alphabet (s) is a sparse hash, so the following line generates + // warnings. + var charMatch = s[text.charAt(j - 1)]; + if (d === 0) { + // First pass: exact match. + rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; + } else { + // Subsequent passes: fuzzy match. + rd[j] = + (((rd[j + 1] << 1) | 1) & charMatch) | + (((last_rd[j + 1] | last_rd[j]) << 1) | 1) | + last_rd[j + 1]; + } + if (rd[j] & matchmask) { + var score = match_bitapScore_(d, j - 1); + // This match will almost certainly be better than any existing match. + // But check anyway. + if (score <= score_threshold) { + // Told you so. + score_threshold = score; + best_loc = j - 1; + if (best_loc > loc) { + // When passing loc, don't exceed our current distance from loc. + start = Math.max(1, 2 * loc - best_loc); + } else { + // Already passed loc, downhill from here on in. + break; + } + } + } + } + // No hope for a (better) match at greater error levels. + if (match_bitapScore_(d + 1, loc) > score_threshold) { + break; + } + last_rd = rd; + } + return best_loc; + }; + + /** + * Initialise the alphabet for the Bitap algorithm. + * @param {string} pattern The text to encode. + * @return {!Object} Hash of character locations. + * @private + */ + diff_match_patch.prototype.match_alphabet_ = function (pattern) { + var s = {}; + for (var i = 0; i < pattern.length; i++) { + s[pattern.charAt(i)] = 0; + } + for (var i = 0; i < pattern.length; i++) { + s[pattern.charAt(i)] |= 1 << (pattern.length - i - 1); + } + return s; + }; + + // PATCH FUNCTIONS + + /** + * Increase the context until it is unique, + * but don't let the pattern expand beyond Match_MaxBits. + * @param {!diff_match_patch.patch_obj} patch The patch to grow. + * @param {string} text Source text. + * @private + */ + diff_match_patch.prototype.patch_addContext_ = function (patch, text) { + if (text.length == 0) { + return; + } + if (patch.start2 === null) { + throw Error("patch not initialized"); + } + var pattern = text.substring(patch.start2, patch.start2 + patch.length1); + var padding = 0; + + // Look for the first and last matches of pattern in text. If two different + // matches are found, increase the pattern length. + while ( + text.indexOf(pattern) != text.lastIndexOf(pattern) && + pattern.length < this.Match_MaxBits - this.Patch_Margin - this.Patch_Margin + ) { + padding += this.Patch_Margin; + pattern = text.substring( + patch.start2 - padding, + patch.start2 + patch.length1 + padding + ); + } + // Add one chunk for good luck. + padding += this.Patch_Margin; + + // Add the prefix. + var prefix = text.substring(patch.start2 - padding, patch.start2); + if (prefix) { + patch.diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, prefix)); + } + // Add the suffix. + var suffix = text.substring( + patch.start2 + patch.length1, + patch.start2 + patch.length1 + padding + ); + if (suffix) { + patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, suffix)); + } + + // Roll back the start points. + patch.start1 -= prefix.length; + patch.start2 -= prefix.length; + // Extend the lengths. + patch.length1 += prefix.length + suffix.length; + patch.length2 += prefix.length + suffix.length; + }; + + /** + * Compute a list of patches to turn text1 into text2. + * Use diffs if provided, otherwise compute it ourselves. + * There are four ways to call this function, depending on what data is + * available to the caller: + * Method 1: + * a = text1, b = text2 + * Method 2: + * a = diffs + * Method 3 (optimal): + * a = text1, b = diffs + * Method 4 (deprecated, use method 3): + * a = text1, b = text2, c = diffs + * + * @param {string|!Array.} a text1 (methods 1,3,4) or + * Array of diff tuples for text1 to text2 (method 2). + * @param {string|!Array.=} opt_b text2 (methods 1,4) or + * Array of diff tuples for text1 to text2 (method 3) or undefined (method 2). + * @param {string|!Array.=} opt_c Array of diff tuples + * for text1 to text2 (method 4) or undefined (methods 1,2,3). + * @return {!Array.} Array of Patch objects. + */ + diff_match_patch.prototype.patch_make = function (a, opt_b, opt_c) { + var text1, diffs; + if ( + typeof a == "string" && + typeof opt_b == "string" && + typeof opt_c == "undefined" + ) { + // Method 1: text1, text2 + // Compute diffs from text1 and text2. + text1 = /** @type {string} */ (a); + diffs = this.diff_main(text1, /** @type {string} */ (opt_b), true); + if (diffs.length > 2) { + this.diff_cleanupSemantic(diffs); + this.diff_cleanupEfficiency(diffs); + } + } else if ( + a && + typeof a == "object" && + typeof opt_b == "undefined" && + typeof opt_c == "undefined" + ) { + // Method 2: diffs + // Compute text1 from diffs. + diffs = /** @type {!Array.} */ (a); + text1 = this.diff_text1(diffs); + } else if ( + typeof a == "string" && + opt_b && + typeof opt_b == "object" && + typeof opt_c == "undefined" + ) { + // Method 3: text1, diffs + text1 = /** @type {string} */ (a); + diffs = /** @type {!Array.} */ (opt_b); + } else if ( + typeof a == "string" && + typeof opt_b == "string" && + opt_c && + typeof opt_c == "object" + ) { + // Method 4: text1, text2, diffs + // text2 is not used. + text1 = /** @type {string} */ (a); + diffs = /** @type {!Array.} */ (opt_c); + } else { + throw new Error("Unknown call format to patch_make."); + } + + if (diffs.length === 0) { + return []; // Get rid of the null case. + } + var patches = []; + var patch = new diff_match_patch.patch_obj(); + var patchDiffLength = 0; // Keeping our own length var is faster in JS. + var char_count1 = 0; // Number of characters into the text1 string. + var char_count2 = 0; // Number of characters into the text2 string. + // Start with text1 (prepatch_text) and apply the diffs until we arrive at + // text2 (postpatch_text). We recreate the patches one by one to determine + // context info. + var prepatch_text = text1; + var postpatch_text = text1; + for (var x = 0; x < diffs.length; x++) { + var diff_type = diffs[x][0]; + var diff_text = diffs[x][1]; + + if (!patchDiffLength && diff_type !== DIFF_EQUAL) { + // A new patch starts here. + patch.start1 = char_count1; + patch.start2 = char_count2; + } + + switch (diff_type) { + case DIFF_INSERT: + patch.diffs[patchDiffLength++] = diffs[x]; + patch.length2 += diff_text.length; + postpatch_text = + postpatch_text.substring(0, char_count2) + + diff_text + + postpatch_text.substring(char_count2); + break; + case DIFF_DELETE: + patch.length1 += diff_text.length; + patch.diffs[patchDiffLength++] = diffs[x]; + postpatch_text = + postpatch_text.substring(0, char_count2) + + postpatch_text.substring(char_count2 + diff_text.length); + break; + case DIFF_EQUAL: + if ( + diff_text.length <= 2 * this.Patch_Margin && + patchDiffLength && + diffs.length != x + 1 + ) { + // Small equality inside a patch. + patch.diffs[patchDiffLength++] = diffs[x]; + patch.length1 += diff_text.length; + patch.length2 += diff_text.length; + } else if (diff_text.length >= 2 * this.Patch_Margin) { + // Time for a new patch. + if (patchDiffLength) { + this.patch_addContext_(patch, prepatch_text); + patches.push(patch); + patch = new diff_match_patch.patch_obj(); + patchDiffLength = 0; + // Unlike Unidiff, our patch lists have a rolling context. + // https://github.com/google/diff-match-patch/wiki/Unidiff + // Update prepatch text & pos to reflect the application of the + // just completed patch. + prepatch_text = postpatch_text; + char_count1 = char_count2; + } + } + break; + } + + // Update the current character count. + if (diff_type !== DIFF_INSERT) { + char_count1 += diff_text.length; + } + if (diff_type !== DIFF_DELETE) { + char_count2 += diff_text.length; + } + } + // Pick up the leftover patch if not empty. + if (patchDiffLength) { + this.patch_addContext_(patch, prepatch_text); + patches.push(patch); + } + + return patches; + }; + + /** + * Given an array of patches, return another array that is identical. + * @param {!Array.} patches Array of Patch objects. + * @return {!Array.} Array of Patch objects. + */ + diff_match_patch.prototype.patch_deepCopy = function (patches) { + // Making deep copies is hard in JavaScript. + var patchesCopy = []; + for (var x = 0; x < patches.length; x++) { + var patch = patches[x]; + var patchCopy = new diff_match_patch.patch_obj(); + patchCopy.diffs = []; + for (var y = 0; y < patch.diffs.length; y++) { + patchCopy.diffs[y] = new diff_match_patch.Diff( + patch.diffs[y][0], + patch.diffs[y][1] + ); + } + patchCopy.start1 = patch.start1; + patchCopy.start2 = patch.start2; + patchCopy.length1 = patch.length1; + patchCopy.length2 = patch.length2; + patchesCopy[x] = patchCopy; + } + return patchesCopy; + }; + + /** + * Merge a set of patches onto the text. Return a patched text, as well + * as a list of true/false values indicating which patches were applied. + * @param {!Array.} patches Array of Patch objects. + * @param {string} text Old text. + * @return {!Array.>} Two element Array, containing the + * new text and an array of boolean values. + */ + diff_match_patch.prototype.patch_apply = function (patches, text) { + if (patches.length == 0) { + return [text, []]; + } + + // Deep copy the patches so that no changes are made to originals. + patches = this.patch_deepCopy(patches); + + var nullPadding = this.patch_addPadding(patches); + text = nullPadding + text + nullPadding; + + this.patch_splitMax(patches); + // delta keeps track of the offset between the expected and actual location + // of the previous patch. If there are patches expected at positions 10 and + // 20, but the first patch was found at 12, delta is 2 and the second patch + // has an effective expected position of 22. + var delta = 0; + var results = []; + for (var x = 0; x < patches.length; x++) { + var expected_loc = patches[x].start2 + delta; + var text1 = this.diff_text1(patches[x].diffs); + var start_loc; + var end_loc = -1; + if (text1.length > this.Match_MaxBits) { + // patch_splitMax will only provide an oversized pattern in the case of + // a monster delete. + start_loc = this.match_main( + text, + text1.substring(0, this.Match_MaxBits), + expected_loc + ); + if (start_loc != -1) { + end_loc = this.match_main( + text, + text1.substring(text1.length - this.Match_MaxBits), + expected_loc + text1.length - this.Match_MaxBits + ); + if (end_loc == -1 || start_loc >= end_loc) { + // Can't find valid trailing context. Drop this patch. + start_loc = -1; + } + } + } else { + start_loc = this.match_main(text, text1, expected_loc); + } + if (start_loc == -1) { + // No match found. :( + results[x] = false; + // Subtract the delta for this failed patch from subsequent patches. + delta -= patches[x].length2 - patches[x].length1; + } else { + // Found a match. :) + results[x] = true; + delta = start_loc - expected_loc; + var text2; + if (end_loc == -1) { + text2 = text.substring(start_loc, start_loc + text1.length); + } else { + text2 = text.substring(start_loc, end_loc + this.Match_MaxBits); + } + if (text1 == text2) { + // Perfect match, just shove the replacement text in. + text = + text.substring(0, start_loc) + + this.diff_text2(patches[x].diffs) + + text.substring(start_loc + text1.length); + } else { + // Imperfect match. Run a diff to get a framework of equivalent + // indices. + var diffs = this.diff_main(text1, text2, false); + if ( + text1.length > this.Match_MaxBits && + this.diff_levenshtein(diffs) / text1.length > + this.Patch_DeleteThreshold + ) { + // The end points match, but the content is unacceptably bad. + results[x] = false; + } else { + this.diff_cleanupSemanticLossless(diffs); + var index1 = 0; + var index2; + for (var y = 0; y < patches[x].diffs.length; y++) { + var mod = patches[x].diffs[y]; + if (mod[0] !== DIFF_EQUAL) { + index2 = this.diff_xIndex(diffs, index1); + } + if (mod[0] === DIFF_INSERT) { + // Insertion + text = + text.substring(0, start_loc + index2) + + mod[1] + + text.substring(start_loc + index2); + } else if (mod[0] === DIFF_DELETE) { + // Deletion + text = + text.substring(0, start_loc + index2) + + text.substring( + start_loc + this.diff_xIndex(diffs, index1 + mod[1].length) + ); + } + if (mod[0] !== DIFF_DELETE) { + index1 += mod[1].length; + } + } + } + } + } + } + // Strip the padding off. + text = text.substring(nullPadding.length, text.length - nullPadding.length); + return [text, results]; + }; + + /** + * Add some padding on text start and end so that edges can match something. + * Intended to be called only from within patch_apply. + * @param {!Array.} patches Array of Patch objects. + * @return {string} The padding string added to each side. + */ + diff_match_patch.prototype.patch_addPadding = function (patches) { + var paddingLength = this.Patch_Margin; + var nullPadding = ""; + for (var x = 1; x <= paddingLength; x++) { + nullPadding += String.fromCharCode(x); + } + + // Bump all the patches forward. + for (var x = 0; x < patches.length; x++) { + patches[x].start1 += paddingLength; + patches[x].start2 += paddingLength; + } + + // Add some padding on start of first diff. + var patch = patches[0]; + var diffs = patch.diffs; + if (diffs.length == 0 || diffs[0][0] != DIFF_EQUAL) { + // Add nullPadding equality. + diffs.unshift(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding)); + patch.start1 -= paddingLength; // Should be 0. + patch.start2 -= paddingLength; // Should be 0. + patch.length1 += paddingLength; + patch.length2 += paddingLength; + } else if (paddingLength > diffs[0][1].length) { + // Grow first equality. + var extraLength = paddingLength - diffs[0][1].length; + diffs[0][1] = nullPadding.substring(diffs[0][1].length) + diffs[0][1]; + patch.start1 -= extraLength; + patch.start2 -= extraLength; + patch.length1 += extraLength; + patch.length2 += extraLength; + } + + // Add some padding on end of last diff. + patch = patches[patches.length - 1]; + diffs = patch.diffs; + if (diffs.length == 0 || diffs[diffs.length - 1][0] != DIFF_EQUAL) { + // Add nullPadding equality. + diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, nullPadding)); + patch.length1 += paddingLength; + patch.length2 += paddingLength; + } else if (paddingLength > diffs[diffs.length - 1][1].length) { + // Grow last equality. + var extraLength = paddingLength - diffs[diffs.length - 1][1].length; + diffs[diffs.length - 1][1] += nullPadding.substring(0, extraLength); + patch.length1 += extraLength; + patch.length2 += extraLength; + } + + return nullPadding; + }; + + /** + * Look through the patches and break up any which are longer than the maximum + * limit of the match algorithm. + * Intended to be called only from within patch_apply. + * @param {!Array.} patches Array of Patch objects. + */ + diff_match_patch.prototype.patch_splitMax = function (patches) { + var patch_size = this.Match_MaxBits; + for (var x = 0; x < patches.length; x++) { + if (patches[x].length1 <= patch_size) { + continue; + } + var bigpatch = patches[x]; + // Remove the big old patch. + patches.splice(x--, 1); + var start1 = bigpatch.start1; + var start2 = bigpatch.start2; + var precontext = ""; + while (bigpatch.diffs.length !== 0) { + // Create one of several smaller patches. + var patch = new diff_match_patch.patch_obj(); + var empty = true; + patch.start1 = start1 - precontext.length; + patch.start2 = start2 - precontext.length; + if (precontext !== "") { + patch.length1 = patch.length2 = precontext.length; + patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, precontext)); + } + while ( + bigpatch.diffs.length !== 0 && + patch.length1 < patch_size - this.Patch_Margin + ) { + var diff_type = bigpatch.diffs[0][0]; + var diff_text = bigpatch.diffs[0][1]; + if (diff_type === DIFF_INSERT) { + // Insertions are harmless. + patch.length2 += diff_text.length; + start2 += diff_text.length; + patch.diffs.push(bigpatch.diffs.shift()); + empty = false; + } else if ( + diff_type === DIFF_DELETE && + patch.diffs.length == 1 && + patch.diffs[0][0] == DIFF_EQUAL && + diff_text.length > 2 * patch_size + ) { + // This is a large deletion. Let it pass in one chunk. + patch.length1 += diff_text.length; + start1 += diff_text.length; + empty = false; + patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text)); + bigpatch.diffs.shift(); + } else { + // Deletion or equality. Only take as much as we can stomach. + diff_text = diff_text.substring( + 0, + patch_size - patch.length1 - this.Patch_Margin + ); + patch.length1 += diff_text.length; + start1 += diff_text.length; + if (diff_type === DIFF_EQUAL) { + patch.length2 += diff_text.length; + start2 += diff_text.length; + } else { + empty = false; + } + patch.diffs.push(new diff_match_patch.Diff(diff_type, diff_text)); + if (diff_text == bigpatch.diffs[0][1]) { + bigpatch.diffs.shift(); + } else { + bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring( + diff_text.length + ); + } + } + } + // Compute the head context for the next patch. + precontext = this.diff_text2(patch.diffs); + precontext = precontext.substring(precontext.length - this.Patch_Margin); + // Append the end context for this patch. + var postcontext = this.diff_text1(bigpatch.diffs).substring( + 0, + this.Patch_Margin + ); + if (postcontext !== "") { + patch.length1 += postcontext.length; + patch.length2 += postcontext.length; + if ( + patch.diffs.length !== 0 && + patch.diffs[patch.diffs.length - 1][0] === DIFF_EQUAL + ) { + patch.diffs[patch.diffs.length - 1][1] += postcontext; + } else { + patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, postcontext)); + } + } + if (!empty) { + patches.splice(++x, 0, patch); + } + } + } + }; + + /** + * Take a list of patches and return a textual representation. + * @param {!Array.} patches Array of Patch objects. + * @return {string} Text representation of patches. + */ + diff_match_patch.prototype.patch_toText = function (patches) { + var text = []; + for (var x = 0; x < patches.length; x++) { + text[x] = patches[x]; + } + return text.join(""); + }; + + /** + * Parse a textual representation of patches and return a list of Patch objects. + * @param {string} textline Text representation of patches. + * @return {!Array.} Array of Patch objects. + * @throws {!Error} If invalid input. + */ + diff_match_patch.prototype.patch_fromText = function (textline) { + var patches = []; + if (!textline) { + return patches; + } + var text = textline.split("\n"); + var textPointer = 0; + var patchHeader = /^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/; + while (textPointer < text.length) { + var m = text[textPointer].match(patchHeader); + if (!m) { + throw new Error("Invalid patch string: " + text[textPointer]); + } + var patch = new diff_match_patch.patch_obj(); + patches.push(patch); + patch.start1 = parseInt(m[1], 10); + if (m[2] === "") { + patch.start1--; + patch.length1 = 1; + } else if (m[2] == "0") { + patch.length1 = 0; + } else { + patch.start1--; + patch.length1 = parseInt(m[2], 10); + } + + patch.start2 = parseInt(m[3], 10); + if (m[4] === "") { + patch.start2--; + patch.length2 = 1; + } else if (m[4] == "0") { + patch.length2 = 0; + } else { + patch.start2--; + patch.length2 = parseInt(m[4], 10); + } + textPointer++; + + while (textPointer < text.length) { + var sign = text[textPointer].charAt(0); + try { + var line = decodeURI(text[textPointer].substring(1)); + } catch (ex) { + // Malformed URI sequence. + throw new Error("Illegal escape in patch_fromText: " + line); + } + if (sign == "-") { + // Deletion. + patch.diffs.push(new diff_match_patch.Diff(DIFF_DELETE, line)); + } else if (sign == "+") { + // Insertion. + patch.diffs.push(new diff_match_patch.Diff(DIFF_INSERT, line)); + } else if (sign == " ") { + // Minor equality. + patch.diffs.push(new diff_match_patch.Diff(DIFF_EQUAL, line)); + } else if (sign == "@") { + // Start of next patch. + break; + } else if (sign === "") { + // Blank line? Whatever. + } else { + // WTF? + throw new Error('Invalid patch mode "' + sign + '" in: ' + line); + } + textPointer++; + } + } + return patches; + }; + + /** + * Class representing one patch operation. + * @constructor + */ + diff_match_patch.patch_obj = function () { + /** @type {!Array.} */ + this.diffs = []; + /** @type {?number} */ + this.start1 = null; + /** @type {?number} */ + this.start2 = null; + /** @type {number} */ + this.length1 = 0; + /** @type {number} */ + this.length2 = 0; + }; + + /** + * Emulate GNU diff's format. + * Header: @@ -382,8 +481,9 @@ + * Indices are printed as 1-based, not 0-based. + * @return {string} The GNU diff string. + */ + diff_match_patch.patch_obj.prototype.toString = function () { + var coords1, coords2; + if (this.length1 === 0) { + coords1 = this.start1 + ",0"; + } else if (this.length1 == 1) { + coords1 = this.start1 + 1; + } else { + coords1 = this.start1 + 1 + "," + this.length1; + } + if (this.length2 === 0) { + coords2 = this.start2 + ",0"; + } else if (this.length2 == 1) { + coords2 = this.start2 + 1; + } else { + coords2 = this.start2 + 1 + "," + this.length2; + } + var text = ["@@ -" + coords1 + " +" + coords2 + " @@\n"]; + var op; + // Escape the body of the patch with %xx notation. + for (var x = 0; x < this.diffs.length; x++) { + switch (this.diffs[x][0]) { + case DIFF_INSERT: + op = "+"; + break; + case DIFF_DELETE: + op = "-"; + break; + case DIFF_EQUAL: + op = " "; + break; + } + text[x + 1] = op + encodeURI(this.diffs[x][1]) + "\n"; + } + return text.join("").replace(/%20/g, " "); + }; + + export default diff_match_patch; + \ No newline at end of file diff --git a/packages/editor/src/runtime/editor/prettier/diffToMonacoTextEdits.test.ts b/packages/frame/src/runtime/editor/prettier/diffToMonacoTextEdits.test.ts similarity index 100% rename from packages/editor/src/runtime/editor/prettier/diffToMonacoTextEdits.test.ts rename to packages/frame/src/runtime/editor/prettier/diffToMonacoTextEdits.test.ts diff --git a/packages/editor/src/runtime/editor/prettier/diffToMonacoTextEdits.ts b/packages/frame/src/runtime/editor/prettier/diffToMonacoTextEdits.ts similarity index 75% rename from packages/editor/src/runtime/editor/prettier/diffToMonacoTextEdits.ts rename to packages/frame/src/runtime/editor/prettier/diffToMonacoTextEdits.ts index e0cb1f737..27d7c9762 100644 --- a/packages/editor/src/runtime/editor/prettier/diffToMonacoTextEdits.ts +++ b/packages/frame/src/runtime/editor/prettier/diffToMonacoTextEdits.ts @@ -1,5 +1,7 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import type * as monaco from "monaco-editor"; -import diff_match_patch from "./diff"; +import diff_match_patch from "./diff.js"; const dmp = new diff_match_patch(); @@ -47,13 +49,15 @@ export function diffToMonacoTextEdits(model: monaco.editor.IModel, v2: string) { const diffs = dmp.diff_main(model.getValue(), v2); const patches = dmp.patch_make(diffs); - let ret: monaco.languages.TextEdit[] = []; + const ret: monaco.languages.TextEdit[] = []; let posDiff = 0; - for (let patch of patches) { + for (const patch of patches) { trimPatch(patch); - let startPos = model.getPositionAt(patch.start1! + posDiff); - let endPos = model.getPositionAt(patch.start1! + patch.length1! + posDiff); - let range: monaco.IRange = { + const startPos = model.getPositionAt(patch.start1! + posDiff); + const endPos = model.getPositionAt( + patch.start1! + patch.length1! + posDiff + ); + const range: monaco.IRange = { startColumn: startPos.column, startLineNumber: startPos.lineNumber, endColumn: endPos.column, @@ -62,9 +66,9 @@ export function diffToMonacoTextEdits(model: monaco.editor.IModel, v2: string) { posDiff += patch.length1 - patch.length2; let newText = ""; - for (let diff of patch.diffs) { - let type = (diff as any)[0]; - let text = (diff as any)[1]; + for (const diff of patch.diffs) { + const type = (diff as any)[0]; + const text = (diff as any)[1]; // type 0: keep, type 1: insert, type -1: delete if (type === 0 || type === 1) { diff --git a/packages/frame/src/runtime/editor/prettier/index.ts b/packages/frame/src/runtime/editor/prettier/index.ts new file mode 100644 index 000000000..068edfd89 --- /dev/null +++ b/packages/frame/src/runtime/editor/prettier/index.ts @@ -0,0 +1,56 @@ +import type * as monaco from "monaco-editor"; +import { diffToMonacoTextEdits } from "./diffToMonacoTextEdits"; + +// TODO: move prettier to shared webworker or host frame? +export function setupPrettier(monacoInstance: typeof monaco) { + monacoInstance.languages.registerDocumentFormattingEditProvider( + "typescript", + { + async provideDocumentFormattingEdits(model, options, token) { + try { + const prettier = await import("prettier/standalone"); + const parserTypescript = await import("prettier/plugins/typescript"); + const esTree = await import("prettier/plugins/estree"); + + const newText = await prettier.format(model.getValue(), { + parser: "typescript", + plugins: [parserTypescript, esTree.default], + tabWidth: 2, + printWidth: 80, + jsxBracketSameLine: true, + }); + + const ret = diffToMonacoTextEdits( + model, + newText.substring(0, newText.length - 1) // disable last \n added by prettier + ); + return ret; + } catch (e) { + console.warn("error while formatting ts code (prettier)", e); + return []; + } + }, + } + ); + + monacoInstance.languages.registerDocumentFormattingEditProvider("css", { + async provideDocumentFormattingEdits(model, options, token) { + const prettier = await import("prettier/standalone"); + const parserCSS = await import("prettier/plugins/postcss"); + try { + const newText = await prettier.format(model.getValue(), { + parser: "css", + plugins: [parserCSS], + tabWidth: 2, + printWidth: 80, + }); + + const ret = diffToMonacoTextEdits(model, newText); + return ret; + } catch (e) { + console.warn("error while formatting css code (prettier)", e); + return []; + } + }, + }); +} diff --git a/packages/editor/src/runtime/editor/setupTests.ts b/packages/frame/src/runtime/editor/setupTests.ts similarity index 91% rename from packages/editor/src/runtime/editor/setupTests.ts rename to packages/frame/src/runtime/editor/setupTests.ts index 8ead74b35..b0867ef80 100644 --- a/packages/editor/src/runtime/editor/setupTests.ts +++ b/packages/frame/src/runtime/editor/setupTests.ts @@ -1,3 +1,9 @@ +/* eslint-disable prefer-rest-params */ +/* eslint-disable @typescript-eslint/ban-types */ +/* eslint-disable prefer-spread */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/ban-ts-comment */ +/* eslint-disable @typescript-eslint/no-empty-function */ /* eslint-disable import/first */ // mock necessary for monaco Object.defineProperty(window, "matchMedia", { diff --git a/packages/editor/src/runtime/editor/workers/editor.worker.ts b/packages/frame/src/runtime/editor/workers/editor.worker.ts similarity index 69% rename from packages/editor/src/runtime/editor/workers/editor.worker.ts rename to packages/frame/src/runtime/editor/workers/editor.worker.ts index 828f5681a..5649a1bdc 100644 --- a/packages/editor/src/runtime/editor/workers/editor.worker.ts +++ b/packages/frame/src/runtime/editor/workers/editor.worker.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import * as worker from "monaco-editor/esm/vs/editor/editor.worker"; diff --git a/packages/editor/src/runtime/editor/workers/ts.worker.ts b/packages/frame/src/runtime/editor/workers/ts.worker.ts similarity index 73% rename from packages/editor/src/runtime/editor/workers/ts.worker.ts rename to packages/frame/src/runtime/editor/workers/ts.worker.ts index a354283d3..4427ebf69 100644 --- a/packages/editor/src/runtime/editor/workers/ts.worker.ts +++ b/packages/frame/src/runtime/editor/workers/ts.worker.ts @@ -1,9 +1,13 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-restricted-globals */ // based on https://github.com/microsoft/TypeScript-Website/issues/191#issuecomment-579531308 // and https://github.com/TypeScriptToLua/TypeScriptToLua.github.io/blob/source/src/pages/play/ts.worker.ts +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import * as worker from "monaco-editor/esm/vs/editor/editor.worker.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { TypeScriptWorker } from "monaco-editor/esm/vs/language/typescript/ts.worker.js"; @@ -22,7 +26,7 @@ export class CustomTypeScriptWorker extends TypeScriptWorker { if (!fileName.startsWith("file:///")) { return text; } - fileName = fileName.substr("file:///".length); + fileName = fileName.substring("file:///".length); const cleaned = decodeURIComponent(fileName); // console.log("worker", cleaned, fileName); @@ -30,7 +34,7 @@ export class CustomTypeScriptWorker extends TypeScriptWorker { // automatically import the context ($) of other cells // The type of this context is defined setupTypecellTypeResolver.ts, and available under !@owner/document if ( - cleaned.startsWith("!@") && + cleaned.startsWith("!") && (cleaned.endsWith(".ts") || cleaned.endsWith(".tsx")) ) { if (cleaned.endsWith(".cell.tsx")) { @@ -79,9 +83,39 @@ export class CustomTypeScriptWorker extends TypeScriptWorker { } } +// for regular webWorker: + globalThis.onmessage = () => { worker.initialize( + // eslint-disable-next-line @typescript-eslint/no-explicit-any (context: any, createData: any) => new CustomTypeScriptWorker(context, createData) ); }; + +// For SharedWorker: + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +// export const connect = (port: any) => { +// // let initialized = false; +// port.onmessage = (e: any) => { +// initialize( +// function (ctx: any, createData: any) { +// return new CustomTypeScriptWorker(ctx, createData); +// }, +// port, +// false +// ); +// }; +// }; + +// // eslint-disable-next-line @typescript-eslint/ban-ts-comment +// // @ts-ignore +// self.onconnect = (e) => { +// const [port] = e.ports; +// connect(port); +// }; + +// if (!("SharedWorkerGlobalScope" in self)) { +// connect(self); +// } diff --git a/packages/frame/src/runtime/editor/workers/worker-init.ts b/packages/frame/src/runtime/editor/workers/worker-init.ts new file mode 100644 index 000000000..209f5208b --- /dev/null +++ b/packages/frame/src/runtime/editor/workers/worker-init.ts @@ -0,0 +1,25 @@ +// from https://github.com/microsoft/monaco-editor/issues/3019 + +/* eslint-disable @typescript-eslint/no-explicit-any */ +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { SimpleWorkerServer } from "monaco-editor/esm/vs/base/common/worker/simpleWorker.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { EditorSimpleWorker } from "monaco-editor/esm/vs/editor/common/services/editorSimpleWorker.js"; + +export function initialize(foreignModule: any, port: any, initialized: any) { + if (initialized) { + return; + } + initialized = true; + const simpleWorker = new SimpleWorkerServer( + (msg: any) => { + port.postMessage(msg); + }, + (host: any) => new EditorSimpleWorker(host, foreignModule) + ); + port.onmessage = (e: any) => { + simpleWorker.onmessage(e.data); + }; +} diff --git a/packages/editor/src/runtime/executor/components/DefaultOutputVisualizer.tsx b/packages/frame/src/runtime/executor/components/DefaultOutputVisualizer.tsx similarity index 81% rename from packages/editor/src/runtime/executor/components/DefaultOutputVisualizer.tsx rename to packages/frame/src/runtime/executor/components/DefaultOutputVisualizer.tsx index 0d1100720..db8eb40b9 100644 --- a/packages/editor/src/runtime/executor/components/DefaultOutputVisualizer.tsx +++ b/packages/frame/src/runtime/executor/components/DefaultOutputVisualizer.tsx @@ -1,7 +1,8 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import { ContainedElement, RetryErrorBoundary } from "@typecell-org/util"; import React, { useEffect, useState } from "react"; import { ObjectInspector } from "react-inspector"; -import { ContainedElement } from "../../../util/ContainedElement"; -import RetryErrorBoundary from "../../../util/RetryErrorBoundary"; +import { OutputWrapper } from "./OutputWrapper"; // TODO: later maybe also use https://github.com/samdenty/console-feed to capture console messages @@ -17,9 +18,10 @@ function findStyleSheet(node: HTMLStyleElement) { // TODO: clean up props, make more simple / readable export const DefaultOutputVisualizer = (props: { mainKey: string | undefined; - mainExport: any; + mainExport: unknown; + // eslint-disable-next-line @typescript-eslint/no-explicit-any output: any; - outputJS: any; + outputJS: unknown; }) => { const { mainKey, mainExport, output, outputJS } = props; @@ -43,16 +45,16 @@ export const DefaultOutputVisualizer = (props: { throw new Error("css sheet not found"); } // based on: https://stackoverflow.com/a/33237161/194651 - let rules = sheet.cssRules; + const rules = sheet.cssRules; // we loop over all rules for (let i = 0; i < rules.length; i++) { - let rule = rules[i]; + const rule = rules[i]; if (rule instanceof CSSStyleRule) { - let selector = rule.selectorText; - let def = rule.cssText.replace(selector, ""); + const selector = rule.selectorText; + const def = rule.cssText.replace(selector, ""); // we update the selector - let selector2 = selector.replace( + const selector2 = selector.replace( /([^,]+,?)/g, ".typecell-output $1 " ); @@ -77,12 +79,12 @@ export const DefaultOutputVisualizer = (props: { ); } else if (mainExport instanceof HTMLStyleElement) { return ( - + - + ); } else if ( mainExport instanceof HTMLElement || @@ -95,12 +97,12 @@ export const DefaultOutputVisualizer = (props: { ); } else { return ( - + - + ); } } @@ -108,17 +110,17 @@ export const DefaultOutputVisualizer = (props: { if (output.stack) { // TODO: proper error check return ( - + - + ); } else { return ( - + - + ); } }; diff --git a/packages/editor/src/runtime/executor/components/ModelOutput.ts b/packages/frame/src/runtime/executor/components/ModelOutput.ts similarity index 93% rename from packages/editor/src/runtime/executor/components/ModelOutput.ts rename to packages/frame/src/runtime/executor/components/ModelOutput.ts index 440165f6d..409e121e6 100644 --- a/packages/editor/src/runtime/executor/components/ModelOutput.ts +++ b/packages/frame/src/runtime/executor/components/ModelOutput.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { makeObservable, observable, runInAction } from "mobx"; import { lifecycle } from "vscode-lib"; import { TypeVisualizer } from "../lib/exports"; @@ -31,13 +32,13 @@ export class ModelOutput extends lifecycle.Disposable { } async updateVisualizers(newValue: string[]) { - for (let key of this.typeVisualizers.keys()) { + for (const key of this.typeVisualizers.keys()) { if (!newValue.includes(key)) { this.typeVisualizers.delete(key); } } - for (let key of newValue) { + for (const key of newValue) { if (!this.typeVisualizers.has(key)) { const ctx = this.context; this.typeVisualizers.set( diff --git a/packages/editor/src/runtime/executor/components/Output.tsx b/packages/frame/src/runtime/executor/components/Output.tsx similarity index 92% rename from packages/editor/src/runtime/executor/components/Output.tsx rename to packages/frame/src/runtime/executor/components/Output.tsx index 77b930c83..d9d1f530a 100644 --- a/packages/editor/src/runtime/executor/components/Output.tsx +++ b/packages/frame/src/runtime/executor/components/Output.tsx @@ -1,9 +1,11 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import { ObservableMap, toJS } from "mobx"; import { observer } from "mobx-react-lite"; import React, { useState } from "react"; import { ObjectInspector } from "react-inspector"; import { DefaultOutputVisualizer } from "./DefaultOutputVisualizer"; import { ModelOutput } from "./ModelOutput"; +import { OutputWrapper } from "./OutputWrapper"; type Props = { modelPath: string; @@ -53,6 +55,7 @@ const Output: React.FC = observer((props) => { if (Object.values(outputJS).length === 1) { [mainKey, mainExport] = Object.entries(outputJS)[0]; + // eslint-disable-next-line no-prototype-builtins } else if (outputJS.hasOwnProperty("default")) { mainKey = "default"; mainExport = outputJS["default"]; @@ -107,16 +110,16 @@ const Output: React.FC = observer((props) => { ); } catch (e: any) { return ( - + - + ); } }); const btnStyle = { border: 0, - position: "relative" as "relative", + position: "relative" as const, bottom: -10, left: -10, background: "none", @@ -124,7 +127,7 @@ const btnStyle = { const btnStyleActive = { ...btnStyle, - textDecoration: "underline" as "underline", + textDecoration: "underline" as const, }; export default Output; diff --git a/packages/frame/src/runtime/executor/components/OutputWrapper.module.css b/packages/frame/src/runtime/executor/components/OutputWrapper.module.css new file mode 100644 index 000000000..3d62e60c7 --- /dev/null +++ b/packages/frame/src/runtime/executor/components/OutputWrapper.module.css @@ -0,0 +1,3 @@ +.outputWrapper { + display: inline-block; +} diff --git a/packages/frame/src/runtime/executor/components/OutputWrapper.tsx b/packages/frame/src/runtime/executor/components/OutputWrapper.tsx new file mode 100644 index 000000000..621c01790 --- /dev/null +++ b/packages/frame/src/runtime/executor/components/OutputWrapper.tsx @@ -0,0 +1,5 @@ +import styles from "./OutputWrapper.module.css"; + +export function OutputWrapper(props: { children: React.ReactNode }) { + return {props.children}; +} diff --git a/packages/editor/src/runtime/executor/executionHosts/ExecutionHost.ts b/packages/frame/src/runtime/executor/executionHosts/ExecutionHost.ts similarity index 92% rename from packages/editor/src/runtime/executor/executionHosts/ExecutionHost.ts rename to packages/frame/src/runtime/executor/executionHosts/ExecutionHost.ts index d5c453894..6461dff64 100644 --- a/packages/editor/src/runtime/executor/executionHosts/ExecutionHost.ts +++ b/packages/frame/src/runtime/executor/executionHosts/ExecutionHost.ts @@ -1,6 +1,5 @@ import React from "react"; import { lifecycle } from "vscode-lib"; -import { TypeCellCodeModel } from "../../../models/TypeCellCodeModel"; /** * The ExecutionHost is responsible for rendering the output of a notebook/code cell. @@ -30,7 +29,7 @@ export type ExecutionHost = lifecycle.IDisposable & { * The actual output is rendered in the